我正在使用下面的代码,似乎有时套接字没有发布
我是怎么发现的? 通过使用进程资源管理器(来自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);
}
}
答案 0 :(得分:1)
你永远阻止:
SNTPData = TimeSocket.Receive(ref EPhost);
如果套接字从未收到数据包,它将一直等到进程终止。
您需要通过在另一个线程上调用TimeSocket.Close()或使用SetSocketOption在接收上设置超时来关闭套接字。