C#在新创建的套接字上丢弃了UDP数据包

时间:2011-04-28 20:39:52

标签: c# sockets udp

嘿所有人。我遇到了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);
    }

1 个答案:

答案 0 :(得分:1)

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

如何调试:

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

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

  3. 以上几点只是调试并确保您猜对了问题。

    可能的解决方案:

    1. 如果是ARP问题,那么我几乎可以肯定你的网络切换问题,所以尝试更换你的“Switch”(我认为它有问题)。
    2. 如果您有可能,那么您可以考虑让您的“ARP​​条目”保持静态。对于所有情况,这可能不是一个好主意,完全取决于您的应用程序的性质是否允许采用这种方法。
    3. 我希望它有所帮助。