2009-07-22 130 views
1

我使用下面的代碼,它似乎有時插座沒有發佈udpclient.close並不總是關閉套接字?

我是如何發現的? 通過使用進程管理器(來自sysinternal), 在應用的屬性,然後進入TCP/IP選項卡。

我可以看到端口正在使用的鍵入「netstat的 - 」進入控制檯

我的問題是,一段時間(如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

如果答案正確,請投票回答! ;) – Isaac 2009-09-10 18:46:53

回答

1

你永遠上阻止:

SNTPData = TimeSocket.Receive(ref EPhost); 

如果套接字永遠不會收到一個包時,它會坐在那裏等待,直到進程死亡。

您需要通過調用另一個線程上的TimeSocket.Close()或使用SetSocketOption設置接收超時來關閉套接字。