2016-06-25 7 views
0

Hier ist mein Code:Socket.Close() beendet Socket.Accept() nicht!

using System; 
using System.Net; 
using System.Net.Sockets; 

public static void main() 
{ 
    Socket _SocketTCP = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    _SocketTCP.Bind(new IPEndPoint(IPAddress.Any, 1234)); 
    _SocketTCP.Listen(5); 

    while (true) 
    { 
     Socket socket; 

     try 
     { 
      socket = _SocketTCP.Accept(); 
     } 
     catch (ObjectDisposedException) 
     { 
      break; 
     } 

     Console.WriteLine("A Client Connected"); 
    } 
    Console.WriteLine("Server Closed"); 
} 

In einem anderen Thread ich _SocketTCP.Close(); nennen. Die while-Schleife wird jedoch nie beendet und "Server geschlossen" wird nie gedruckt, nachdem ich die Methode _SocketTCP.Close(); aufgerufen habe. Was mache ich falsch ??

+1

Bitte erstellen Sie ausführbaren Repro-Code. Normalerweise funktioniert das ... denke ich. – usr

Antwort

0

Soweit Sie fangen ObjectDisposedException müssen Sie tatsächlich Dispose Methode auf Ihrem _SocketTCP aufrufen.

+0

Die Methode 'Socket.Close()' verfügt über das 'Socket'-Objekt. Die Methode 'Socket.Receive()' wird beendet, sie wirft 'ObjectDisposedException', wenn die Methode' Socket.Close() 'aufgerufen wird. Dies funktioniert jedoch nicht mit der 'Socket.Accept()' Methode. – None

+0

@None yep, du hast Recht, tut mir leid. Könnten Sie versuchen, 'SocketException', nicht' ObjectDisposedException' zu fangen? Es sollte Ihnen eine Nachricht wie 'Eine Blockierung Operation wurde von Blah-blah-blah cancled? Wenn es nicht für Sie funktioniert, geben Sie bitte einen Code, wo Sie 'Close()' auf Ihrem 'Socket' nennen, weil Ihr Fall wirklich seltsam ist :) – hazevich