.NET UDP数据接收

时间:2012-10-16 02:24:33

标签: c# .net udp wireshark

我有一个简单的UDP侦听器,我正在尝试从中收集数据报。我的数据报可以是两种数据格式之一。使用第一种数据格式,我按预期在程序中接收数据。对于第二个,尽管我可以通过Wireshark验证UDP数据是否传递到网络接口,但绝对没有迹象表明我的程序已收到数据。我认为也许这些是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似乎没有看到他们?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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

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

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

如果您不关心客户端端点,则可以使用Receive而不是ReceiveFrom。 可能你的客户端没有从192.168.1.100:2000发送数据包,这就是你没有收到它们的原因;想到为什么在调用ReceiveFrom时我没有得到例外。

此外: 无需在:

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

2000已经是一个int。