C#在新创建的套接字上丢弃UDP数据包
大家好。我对c#有一个问题,很可能是调试器的问题,但我对c#相当陌生(对c/c++并不陌生) 下面是代码。这就是我面临的问题 我得到UDP,但不保证交货,当然。如果我把管道塞满的话,我希望偶尔的数据包会被网络或windows丢弃。然而,我遇到的问题是,在创建一个新套接字之后,我尝试发送一个包含1字节数据的数据包。这个包被丢弃了。我可以试着发两次,两次都掉了。然而,如果我发送了价值1k的数据,它就会通过。如果我创建了另一个套接字(再次单击按钮),一切都正常。现在有件奇怪的事。如果我停止并重新开始调试项目,而不对源代码进行任何更改,那么我的所有数据包都会顺利发送。这似乎只发生在项目建成后的第一次运行中。不管怎样,下面是重现问题的代码。经过几个小时的搜索和阅读,我不知所措。 编辑:想澄清一下,我使用的是wireshark,可以看到数据包被丢弃C#在新创建的套接字上丢弃UDP数据包,c#,sockets,udp,C#,Sockets,Udp,大家好。我对c#有一个问题,很可能是调试器的问题,但我对c#相当陌生(对c/c++并不陌生) 下面是代码。这就是我面临的问题 我得到UDP,但不保证交货,当然。如果我把管道塞满的话,我希望偶尔的数据包会被网络或windows丢弃。然而,我遇到的问题是,在创建一个新套接字之后,我尝试发送一个包含1字节数据的数据包。这个包被丢弃了。我可以试着发两次,两次都掉了。然而,如果我发送了价值1k的数据,它就会通过。如果我创建了另一个套接字(再次单击按钮),一切都正常。现在有件奇怪的事。如果我停止并重新开始调
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问题的评论,我想提出一些调试和缩小问题范围的方法,然后提出一些解决方案
如何调试:
我希望这能有所帮助。你能分享接收代码吗?我看不出与发布接收代码有什么关联。它是用c语言在arm处理器上编写的。我可以用wireshark看到所有东西。如果你这么想,我上面发布的代码将允许你重新创建问题。我想知道如果你把a变成一个字而不是一个字节,你是否会丢失数据包。又是胡乱猜测,但这条线索能帮上忙吗?或者这个@detay我看到了那两个帖子中的一个。谢谢你。我不知道一个单词和一个字节是否会有所不同,但我想说的是,无论是否出现在线路上,所有三个sendto调用都会返回正确的发送字节数。谢谢提示。我的应用程序可以容忍使用静态arp条目。在win7中,您需要使用netsh,因为此功能已从“arp”中删除。唯一不能容错的数据包是第一个数据包。我只发送了两次,中间有一个停顿。如果两者都发送了,这不是问题。然而,我发现有趣的是,到达目的地的第一个数据包不在arp缓存中,很有可能被丢弃。我想我对尽力而为的定义是不同的。谢谢你的提示。