我正在制作一个服务器/客户端应用程序。
我将服务器套接字设置为侦听,并设置 BeginAccept() 方法。
当我关闭服务器套接字(Socket.Close())以关闭服务器时,
BeginAccept() 方法的异步回调方法抛出异常。
我检查了异常,发现异常对我说:
消息“无法访问名为
“系统.Net.Sockets.Socket”。
对象名称:“System.Net.Sockets.Socket”。”字符串
在我看来,这就是这样的:“当我调用时套接字已释放
Socket.Close()方法,但是回调之前没有释放
插座已关闭。”
我在网上搜索了一下,发现这不是一个错误,而是一个设计的异常,因为 beginaccept 被取消了。
我的问题是如何处理这个异常?需要进行什么处理?
我只是将其视为正常事件:
OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message);
OnUpdateNetworkStatusMessage(this, eventArgs);
仍然欢迎任何评论。
如果您不关心异常(即它不是“异常”,它是正常操作过程并且每次都会发生),您可以忽略/抑制它。 (只要它不会发生在表明真正错误的情况下)
如果您想更整齐地抑制它,那么您可以设置一个标志来告诉您的回调它应该关闭,并让回调实际上执行套接字的关闭/处置。这样您就可以保证套接字上没有待处理的读取,并且不会出现异常(但这意味着它将无限期地挂起,直到收到另一个数据包 - 这当然可能永远不会发生)。
如果您控制着通信链路的两端,那么您可以发送一条显式的“关闭”消息,告诉客户端应该关闭连接(当然这可以在收到消息时在回调中应用) 。
(但我很想听听其他人是否找到了更好的解决方案,因为我在 UDP 通信实现方面也遇到了类似的情况)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)