繁体   English   中英

如何从C#udp套接字异常中优雅地恢复

[英]How to recover gracefully from a C# udp socket exception

上下文:我正在将一个Linux perl应用程序移植到C#,服务器侦听一个udp端口,并通过一个udp套接字维护与远程客户端的多个并发对话框。 在测试期间,我向udp服务器发送大量数据包,随机重启客户端以观察服务器注册新连接。 问题是这样的:当我杀死一个udp客户端时,服务器上可能仍然存在发往该客户端的数据。 当服务器尝试发送此数据时,它会返回icmp“无服务可用”消息,因此套接字上发生异常。

我无法重用此套接字,当我尝试将C#异步处理程序与套接字关联时,它会抱怨异常,因此我必须关闭并重新打开服务器端口上的udp套接字。 这是解决这个问题的唯一方法吗?肯定有一些“修复”udp套接字的方法,从技术上讲,UDP套接字不应该知道远程套接字的状态?

任何帮助或指针将不胜感激。 谢谢。

我认为你说得对:'服务器不应该知道'。 如果您将UDP数据包发送到可能打开或未打开的某个IP /端口,则无法知道服务器是否到达目的地。

服务器知道的唯一方法是让客户端发回ACK。 (在丢失包的情况下,客户端和服务器都必须具有重新发送机制)。

很明显,你的代码中正在发生其他事情(或者使用.Net udp实现)

编辑:

在尼古拉的评论之后,我检查了文档。 事实上,在使用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);

那么你可以发送给你选择的任何人,而无需“连接”。

我不确定你的代码是什么样的,但是检查你是否正在使用不假设“连接”的正确命令集可能是值得的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM