当我的程序退出时,我试图停止 TCP 侦听器。我不关心套接字或任何活动客户端套接字上当前活动的任何数据。
套接字清理代码本质上是:
try
{
myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()
myServer 是一个 TCPListener
某些情况下,Shutdown会抛出异常
System.Net.Sockets.SocketException:
发送或接收数据的请求被禁止,因为套接字未连接并且(使用 sendto 调用在数据报套接字上发送时)未提供地址
在System.Net.Sockets.Socket.Shutdown(SocketShutdown如何)
编辑2010年5月14日
经过进一步调查,可以抛出异常并且可以正确关闭套接字。
有时,即使应用程序退出后netstat表明套接字仍处于 LISTENING 状态。
我无法创建明确的再现场景,它发生在看似随机的时间。
客户端套接字被独立清理。
你有什么建议可以帮助我让这个插座死掉吗?
使用finally块在发生异常时调用Close():
try
{
myServer.Server.Shutdown(SocketShutdown.Both);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
myServer.Server.Close(0);
myServer.Stop();
}
我也很好奇是否由于您没有提到的某些规范而需要对底层套接字进行操作? TCPListener/Client 的设计使您在大多数情况下不必担心这些通信机制。
另外,如果这没有帮助,那么 SocketException 返回的 ErrorCode 是什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)