加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:54:47 所属栏目:百科 来源:网络整理
导读:上下文:我将 linux perl应用程序移植到C#,服务器在udp端口上侦听,并通过一个udp套接字与远程客户端维护多个并发对话.在测试期间,我发送大量的数据包到udp服务器,随机重新启动客户端观察服务器注册新的连接.问题是这样的:当我杀死一个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);

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读