【问题标题】:.NET UDP Data Reception.NET UDP 数据接收
【发布时间】:2012-10-16 02:24:33
【问题描述】:

我有一个简单的 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 似乎看不到它们?

【问题讨论】:

    标签: c# .net udp wireshark


    【解决方案1】:

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

    【讨论】:

    • 为澄清起见,我正在尝试使用返回的数据打印 DateTime.Now ,但仍然看不到任何内容。
    • 29 字节的数据报包含什么?你能发布前几个字节吗?
    • 我在原帖中添加了一个数据报示例。
    【解决方案2】:

    您的代码中缺少某些内容。调用 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。

    【讨论】:

    • 我认为异常可能是因为它在单独的线程中运行。我必须运行代码...
    • 你是对的。我不知道为什么我把 bind 语句排除在外。我也将方法更改为接收。但是,尽管这些客户端出现在 Wireshark 中,我仍然看不到任何来自这些客户端的 UDP 数据包。
    • 我唯一能想到的是它们没有被发送到正确的端口或正确的接口,你是绑定到 0.0.0.0 还是特定的 IP 地址?
    • 抱歉重新IP地址没有看到你的代码...唯一的选择是如果数据包没有被发送到端口2000。wireshark在哪里运行(服务器或客户端)?另一个远程选项是网络错误。
    • Wireshark 确认数据包正在发送到服务器上的 UDP 端口 2000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多