如何从C#udp套接字异常正常恢复

前端之家收集整理的这篇文章主要介绍了如何从C#udp套接字异常正常恢复前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
上下文:我将 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);

那么你可以发送给任何你选择没有’连接’.

我不知道你的代码是什么样的,但是可能值得检查一下使用正确的一组命令,这些命令不会假定“连接”

猜你在找的C&C++相关文章