2009-07-22 8 views
1

Ich benutze den Code unten, es scheint irgendwann der Sockel ist nicht freigegebenudpclient.close schließt den Socket nicht immer?

Wie habe ich das gefunden? mit Process Explorer (von sysinternal), Eigenschaften auf die Anwendung dann in die Registerkarte TCP/IP gehen.

Ich kann den Hafen sehen werden, indem Sie „netstat -a“ in eine Konsole verwendet

Mein Problem ist, nach einer gewissen Zeit (wie 5 Wochen) dort wie 40-Port ist durch die Anwendung verwendet, während es sein sollte Null.

Wer weiß, warum es das tut?

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

Stimmen Sie die Antwort ab, wenn es richtig ist! ;) – Isaac

Antwort

1

Sie blockieren immer auf:

SNTPData = TimeSocket.Receive(ref EPhost); 

Wenn der Socket nie ein Paket empfängt, wird es dort warten sitzen, bis der Prozess stirbt.

Sie müssen den Socket schließen, indem Sie TimeSocket.Close() für einen anderen Thread aufrufen oder indem Sie mit SetSocketOption eine Zeitüberschreitung für den Empfang festlegen.