Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在新创建的套接字上丢弃UDP数据包_C#_Sockets_Udp - Fatal编程技术网

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

C#在新创建的套接字上丢弃UDP数据包,c#,sockets,udp,C#,Sockets,Udp,大家好。我对c#有一个问题,很可能是调试器的问题,但我对c#相当陌生(对c/c++并不陌生) 下面是代码。这就是我面临的问题 我得到UDP,但不保证交货,当然。如果我把管道塞满的话,我希望偶尔的数据包会被网络或windows丢弃。然而,我遇到的问题是,在创建一个新套接字之后,我尝试发送一个包含1字节数据的数据包。这个包被丢弃了。我可以试着发两次,两次都掉了。然而,如果我发送了价值1k的数据,它就会通过。如果我创建了另一个套接字(再次单击按钮),一切都正常。现在有件奇怪的事。如果我停止并重新开始调

大家好。我对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);
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
字节[]a=新字节[1]{0x00};
字节[]b=新字节[1024];
对于(int i=0;i<1024;i++)
{
b[i]=0xFF;
}
IPEndPoint _ipep=新的IPEndPoint(IPAddress.Parse(“192.168.200.202”),5546);
Socket _server=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
_SendTo(a,1,SocketFlags.None,_-ipep);
_SendTo(a,1,SocketFlags.None,_-ipep);
_SendTo(b,1024,SocketFlags.None,_-ipep);
}

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

如何调试:

  • 尝试将ARP条目设置为“静态”,以便 您的电脑不发送ARP请求 每一次。使ARP条目保持静态 您可以在命令中写入“arp” 提示查看选项列表 并帮助添加静态ARP条目

  • 另一个想法是打开命令 提示并写“ping” 192.168.200.202-t”,这样您的电脑就可以继续ping其他客户端。 这将保留您电脑的ARP条目 最新信息以及您将运行的时间 你的C#程序,它不会发送 再次ARP,它将直接发送 UDP

  • 以上几点只是为了调试并确保您正确地猜到了问题

    可能的解决方案:

  • 如果是ARP问题,那么我几乎可以肯定这是你的网络交换机的问题,所以试着更换你的“交换机”(我认为它有故障)
  • 如果可能的话,你可以考虑将你的“ARP条目”设置为静态。对于所有情况,这可能不是一个好主意,完全取决于应用程序的性质是否允许使用这种方法

  • 我希望这能有所帮助。

    你能分享接收代码吗?我看不出与发布接收代码有什么关联。它是用c语言在arm处理器上编写的。我可以用wireshark看到所有东西。如果你这么想,我上面发布的代码将允许你重新创建问题。我想知道如果你把a变成一个字而不是一个字节,你是否会丢失数据包。又是胡乱猜测,但这条线索能帮上忙吗?或者这个@detay我看到了那两个帖子中的一个。谢谢你。我不知道一个单词和一个字节是否会有所不同,但我想说的是,无论是否出现在线路上,所有三个sendto调用都会返回正确的发送字节数。谢谢提示。我的应用程序可以容忍使用静态arp条目。在win7中,您需要使用netsh,因为此功能已从“arp”中删除。唯一不能容错的数据包是第一个数据包。我只发送了两次,中间有一个停顿。如果两者都发送了,这不是问题。然而,我发现有趣的是,到达目的地的第一个数据包不在arp缓存中,很有可能被丢弃。我想我对尽力而为的定义是不同的。谢谢你的提示。