语境:我移植一个Linux Perl的应用C#,服务器监听UDP端口上,并通过一个单一的UDP套接字保持与远程客户端的多个并发的对话.在测试期间,我向udp服务器发送大量数据包,随机重启客户端以观察服务器注册新连接.问题是这样的:当我杀死一个udp客户端时,服务器上可能仍然存在发往该客户端的数据.当服务器尝试发送此数据时,它会返回icmp"无服务可用"消息,因此套接字上发生异常.
我不能再使用这个插座,当我尝试将C#异步处理器与插槽相关联,它抱怨例外,所以我必须关闭并重新打开服务器端口的UDP套接字.这是解决这个问题的唯一方法吗?肯定有一些"修复"udp套接字的方法,从技术上讲,UDP套接字不应该知道远程套接字的状态?
任何帮助或指针将不胜感激.谢谢.
我认为你说得对:“服务器不应该知道”。如果您将 UDP 数据包发送到某个可能打开或未打开的 IP/端口,则服务器无法知道它是否到达了目的地。
服务器知道的唯一方法是让客户端发回 ACK。(此外,客户端和服务器都必须具有重新发送机制,以防丢失包)。
很明显,您的代码中(或 .Net udp 实现)发生了其他事情
编辑:
尼古拉发表评论后,我检查了文档。事实上,.Net 在使用 UDP 时存在“连接”或“无连接”的区别。
如果您使用这样的代码:
UdpClient udpClient = new UdpClient(11000); //sourceport
try{
udpClient.Connect("www.contoso.com", 11000); //'connect' to destmachine and port
// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
udpClient.Send(sendBytes, sendBytes.Length);
Run Code Online (Sandbox Code Playgroud)
那么显然你已经“连接”了
但是,如果您使用这样的代码:
UdpClient udpClientB = new UdpClient();
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);
Run Code Online (Sandbox Code Playgroud)
然后您可以发送给您选择的任何人,而无需“连接”。
我不确定您的代码是什么样的,但可能值得检查您是否使用了不假定“连接”的正确命令集