【问题标题】:C# dropped UDP packets on newly created socketC# 在新创建的套接字上丢弃了 UDP 数据包
【发布时间】:2011-04-28 20:39:52
【问题描述】:

大家好。我在使用 c# 时遇到问题,很可能是调试器,但我对 c# 相当陌生(对 c/c++ 不是新手)

下面有代码。这是我遇到的问题。

我得到了 UDP,当然不能保证交付。如果我将管道塞满,我希望偶尔的数据包会在网络上或 Windows 上被丢弃。但是,我遇到的问题是,在创建新套接字后,我尝试发送一个包含 1 个字节数据的数据包。该数据包被丢弃。我可以尝试发送两次,两次都掉线了。但是,如果我发送价值 1k 的数据,它就会通过。如果我创建另一个套接字(通过再次单击按钮),一切正常。现在这是奇怪的事情。如果我停止并重新开始调试项目而不对源进行任何更改,我的所有数据包都会毫无问题地发送。它似乎只发生在项目构建后的第一次运行中。无论如何,这是重现该问题的代码。经过几个小时的搜索和阅读,我不知所措。 编辑:想澄清我正在使用wireshark并且可以看到数据包被丢弃了。

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] a = new byte[1] {0x00};
        byte[] b = new byte[1024];
        for(int i = 0; i < 1024; i++)
        {
            b[i] = 0xFF;
        }

        IPEndPoint _ipep = new IPEndPoint(IPAddress.Parse("192.168.200.202"),5546);
        Socket _server =  new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        _server.SendTo(a, 1, SocketFlags.None, _ipep);
        _server.SendTo(a, 1, SocketFlags.None, _ipep);
        _server.SendTo(b, 1024, SocketFlags.None, _ipep);
    }

【问题讨论】:

  • 可以分享一下接收码吗?
  • 我没有看到发布接收代码的相关性。它是在 arm 处理器上用 c 语言编写的。我可以用wireshark看到一切。
  • 如果您愿意,我在上面发布的代码将允许您重新创建问题。
  • 我想知道如果你把 a 变成一个单词而不是一个字节,你是否会丢失数据包。再次疯狂猜测,但这个线程可以提供一些帮助吗? stackoverflow.com/questions/4655332/… 或者这个stackoverflow.com/questions/2576184/…
  • @detay 我看到了这两个帖子之一。谢谢你。我不知道单词与字节是否会有所不同,但我确实想提一下,所有三个 sendto 调用都会返回正确的发送字节数,无论它们是否显示在网络上。

标签: c# sockets udp


【解决方案1】:

根据您对 ARP 问题的评论,我想提出一些调试和缩小问题范围的方法,然后提出一些解决方案。

如何调试:

  1. 尝试将 ARP 条目设为“静态”,这样 你的电脑不发送 ARP 请求 每一次。使 ARP 条目静态化 你可以在命令上写“arp” 提示查看选项列表 并帮助添加静态 ARP 条目。

  2. 另一种思路是打开命令 提示并写“ping 192.168.200.202 -t",这样您的 PC 就会继续 ping 另一个客户端。 这将保留您 PC 的 ARP 条目 最新的以及何时运行 你的 C# 程序,它不会发送 再次ARP,它会直接发送 UDP。

以上几点只是为了调试,确保你猜对了问题。

可能的解决方案:

  1. 如果是 ARP 问题,那么我几乎可以确定是您的网络交换机有问题,因此请尝试更换您的“交换机”(我认为它有问题)。
  2. 如果可能的话,您可以考虑将“ARP 条目”设为静态。对于所有情况,这可能不是一个好主意,并且完全取决于您的应用程序的性质是否允许采用这种方法。

希望对你有帮助。

【讨论】:

  • 感谢您的提示。我的应用程序可以容忍使用静态 arp 条目。在 win7 中,您需要使用 netsh,因为此功能已从“arp”中删除。唯一不能容错的数据包是第一个数据包。我只是发送了两次,中间有一个暂停。如果两者都发送,则不是问题。但是,我发现有趣的是,到达不在 arp 缓存中的目的地的第一个数据包很可能被丢弃。猜猜我对尽力而为的定义不同。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多