我正在使用下面的代码,似乎有时套接字未释放
我是怎么发现的?
通过使用进程浏览器(来自sysinternal),
申请的专有权
然后进入“TCP/IP”选项卡。
通过在控制台中输入“netstat -a”,我可以看到正在使用的端口
我的问题是,一段时间(如5周)后,应用程序使用了40个端口,而该端口应为零。
有人知道为什么会这样吗?
public void Connect()
{
try {
// Resolve server address
IPHostEntry hostadd = Dns.GetHostEntry(TimeServer);
IPEndPoint EPhost = new IPEndPoint(hostadd.AddressList[0], 123);
//Connect the time server
UdpClient TimeSocket = new UdpClient();
TimeSocket.Connect(EPhost);
TimeSocket.Send(SNTPData, SNTPData.Length);
SNTPData = TimeSocket.Receive(ref EPhost);
TimeSocket.Close();
if (!IsResponseValid())
{
throw new Exception("Invalid response from " + TimeServer);
}
} catch(SocketException e)
{
throw new Exception(e.Message);
}
}
最佳答案
您将永远阻止:
SNTPData = TimeSocket.Receive(ref EPhost);
如果套接字从未收到过数据包,它将坐在那里等待直到进程终止。
您需要通过在其他线程上调用TimeSocket.Close()或通过使用SetSocketOption设置接收超时来关闭套接字。
关于c# - udpclient.close并不总是关闭套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1165362/