上下文:我将
linux perl应用程序移植到C#,服务器在udp端口上侦听,并通过一个udp套接字与远程客户端维护多个并发对话.在测试期间,我发送大量的数据包到udp服务器,随机重新启动客户端观察服务器注册新的连接.问题是这样的:当我杀死一个udp客户端时,可能仍然存在着该客户端的服务器上的数据.当服务器尝试发送此数据时,它会返回icmp“no service available”消息,因此套接字上发生异常.
我不能重用这个套接字,当我尝试将C#异步处理程序与套接字相关联时,它抱怨异常,所以我必须关闭并重新打开服务器端口上的udp套接字.这是解决这个问题的唯一方法吗?确实有一些“修复”udp套接字的方法,从技术上讲,UDP套接字不应该知道远程套接字的状态?
任何帮助或指针将不胜感激.谢谢.
解决方法
我想你是对的说:’服务器不应该知道’.如果您将UDP数据包发送到某些可能打开或可能不会打开的IP /端口,则无法知道服务器到达目的地址.
服务器知道的唯一方法是让客户端发回ACK. (客户端和服务器也必须在丢失包的情况下重新发送机制).
所以很明显你的代码中还有一些事情(或者.Net udp实现)
编辑:
在Nikolai的评论之后,我检查了文档.在使用UDP时,在.Net中有一个区别,即“连接”或“无连接”.
如果你使用这样的代码:
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);
那么显然你是’连接’
但是,如果使用如下代码:
UdpClient udpClientB = new UdpClient(); udpClientB.Send(sendBytes,sendBytes.Length,"AlternateHostMachineName",11000);
那么你可以发送给任何你选择没有’连接’.
我不知道你的代码是什么样的,但是可能值得检查一下使用正确的一组命令,这些命令不会假定“连接”