2016-06-25 87 views
0

這裏是我的代碼:Socket.Close()不會終止Socket.Accept()!

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"); 
} 

在另一個線程我叫_SocketTCP.Close();。但是,在我調用_SocketTCP.Close();方法後,while循環永遠不會退出並且「服務器已關閉」從不打印。 我在做什麼錯?

+1

請創建可執行的repro代碼。通常情況下,這是有效的......我想。 – usr

回答

0

只要你趕上ObjectDisposedException你需要在你的_SocketTCP上實際調用Dispose方法。

+0

'Socket.Close()'方法放置'Socket'對象。 'Socket.Receive()'方法被終止,當'Socket.Close()'方法被調用時拋出'ObjectDisposedException'。但是,這不適用於'Socket.Accept()'方法。 – None

+0

@沒錯,你說得對,對不起。你可以嘗試捕獲'SocketException',而不是'ObjectDisposedException'?它應該給你一個信息,比如'阻塞操作可以被blah-blah-blah'支持嗎?如果它不適合你,請提供一個代碼,在你的'Socket'上調用'Close()',因爲你的情況真的很奇怪:) – hazevich