如何确定哪个 EndPoint 导致了错误代码 10054 的 SocketException? (“现有连接被远程主机强行关闭。”)
Posted
技术标签:
【中文标题】如何确定哪个 EndPoint 导致了错误代码 10054 的 SocketException? (“现有连接被远程主机强行关闭。”)【英文标题】:How do I determine which EndPoint caused a SocketException with error code 10054? ("An existing connection was forcibly closed by the remote host.") 【发布时间】:2012-11-18 09:33:12 【问题描述】:总结一下我的情况,我正在编写一个服务器程序,它打开一个 UDP 套接字,任意数量的客户端都可以与之通信。我使用类似于以下的代码接收 UDP 数据包:
EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
try
count = socket.ReceiveFrom(buf, ref sender); // 'count' and 'buf' are defined elsewhere
// If an exception isn't thrown, 'sender' will now contain the EndPoint of the client that sent the packet.
catch(SocketException e)
if(e.ErrorCode == 10054)
// How do I get the EndPoint that caused the error?
// The 'sender' variable above does not contain the EndPoint.
当我的服务器向已关闭其自己的套接字的客户端发送数据包时,我收到错误代码 10054(“现有连接被远程主机强制关闭”)。我想停止向该客户端发送数据包,以便停止抛出 SocketExceptions,这会严重损害我的服务器性能。
但我的问题是我不知道如何获取被强制关闭的特定客户端的 EndPoint。 (上面的 'sender' 变量在抛出异常之前没有设置为任何有用的值。)我怎样才能找到那个 EndPoint?
一个不太理想但仍然可行的解决方案是简单地禁止抛出 SocketException。
有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:我想我有一个想法。您应该创建并维护一个客户端列表,该列表将包含它们的所有端点(以及您可能需要的其他有用信息)。
然后数据传输将发生在“已连接”的客户端上,而所有其他尚未“未知”的计算机通常会尝试通过 IPAddress.Any
与您“连接”。
【讨论】:
嗯,有趣的想法...我想我可以为我的每个“已知客户”调用 ReceiveFrom,然后为 IPAddress.Any 调用 ReceiveFrom 以获取任何新连接。我会试试的。 @WaltD 这就是我的意思。以上是关于如何确定哪个 EndPoint 导致了错误代码 10054 的 SocketException? (“现有连接被远程主机强行关闭。”)的主要内容,如果未能解决你的问题,请参考以下文章
如何确定哪个 UIControlEvents 类型导致了 UIEvent?
Windows Audio Endpoint Builder服务(位于 本地计算机上) 错误1722:RPC 服务器不可用。