0

我有一个简单的 UDP 侦听器,我试图从中收集数据报。我的数据报可以是两种数据格式之一。使用第一种数据格式,我按预期在我的程序中接收数据。对于第二个,绝对没有迹象表明曾经从我的程序接收到数据,即使我可以验证 UDP 数据是否通过 Wireshark 传递到网络接口。我认为这些可能是 Windows 拒绝的格式错误的 UDP 数据包,但 Wireshark 确实将它们标记为 UDP。我的代码如下:

    static void Main(string[] args)
    {
        Thread thdUdpServer = new Thread(new ThreadStart(serverThread));
        thdUdpServer.Start();
    }

    static void serverThread()
    {

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket.Bind(new IPEndPoint(new IPAddress(0), 2000));

        while (true)
        {
            byte[] responseData = new byte[128];
            socket.Receive(responseData);
            string returnData = Encoding.ASCII.GetString(responseData);
            Console.WriteLine(DateTime.Now + " " + returnData);

        }

丢失的数据包都是 29 字节的数据报,看起来像这样(转换为 ASCII)。

#01RdFFFF...?...... ........F

为什么 Wireshark 会显示它们的存在,但 .NET 似乎看不到它们?

4

2 回答 2

2

如果字节包含不可打印的 ASCII 字符,您可能在控制台上看不到它们。

于 2012-10-16T02:30:54.873 回答
0

您的代码中缺少某些内容。调用 ReceiveFrom 时应该抛出套接字异常(至少根据 MSDN,没有尝试过您的代码。)

您应该将您的套接字绑定到您要监听的地址:端口(或使用 0.0.0.0 作为监听任何本地地址的地址):

socket.Bind(new IPEndPoint(new IPAddress(0), 2000);

ReceiveFrom 中的 EndPoint 不是服务器的监听端口。这是您要从中接收数据包的地址。您可以使用端点 0.0.0.0:0 从任何主机接收。

从该方法返回后,端点将填充发送数据包的主机(客户端)的地址。

如果您不关心客户端端点,则可以使用 Receive 而不是 ReceiveFrom。您的客户端可能没有从 192.168.1.100:2000 发送数据包,这就是您没有收到它们的原因;想一想为什么在调用 ReceiveFrom 时没有出现异常,这超出了我的理解。

另外:无需调用 Convert.ToInt32 :

new IPEndPoint(IPAddress.Parse("192.168.1.100"), Convert.ToInt32(2000));

2000 已经是一个整数。

于 2012-10-16T03:10:06.763 回答