2013-02-28 139 views
0

我設置了一個套接字偵聽傳入的連接:上次連接關閉後,如何通過套接字監聽傳入連接?

public Socket Handler; 

public void StartListening() 
{ 
    // Establish the locel endpoint for the socket 
    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port); 

    // Create a TCP/IP socket 
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    try 
    { 
     // Bind the socket to the local endpoint and listen 
     listener.Blocking = false; 
     listener.Bind(localEndPoint); 
     listener.Listen(100); 

     // Start an asynchronous socket to listen for connections 
     listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
    } 
    catch (Exception e) 
    { 
     invokeStatusUpdate(0, e.Message); 
    }    
} 

private void AcceptCallback(IAsyncResult ar) 
{ 
    // Get the socket that handles the client request 
    Socket listener = (Socket) ar.AsyncState; 
    Socket handler = listener.EndAccept(ar); 
    Handler = handler; 

    // Create the state object 
    StateObject state = new StateObject(); 
    state.workSocket = handler; 
    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); 
} 

正如你可以在上面看到,一旦建立連接,設置我的BeginReceive回調。這工作正常。

最終我得到的地步,我想關閉當前連接,然後開始一個進來的連接嘗試再次聽我的插座:

public void CloseNode(bool restart) 
{ 
    try 
    { 
     if (Handler != null) 
     { 
      Handler.Shutdown(SocketShutdown.Both); 
      Handler.Close(); 
      Handler.Dispose(); 
      Handler = null; 
     } 

     if (restart) 
      StartListening(); 
    } 
    catch (Exception e) 
    { 
     invokeStatusUpdate(0, e.Message); 
    } 
} 

我close方法採用布爾知道是否應該開始收聽更多的傳入連接。

的問題是,當我重新回到我的StartListening方法,我得到一個異常上說,「只有一個每個套接字地址(協議/網絡地址/端口)的使用通常允許」listener.Bind(localEndPoint);

我該如何着手設置我的收聽再次開始收聽?

回答

1

打破它分爲兩個方法:startListening()continueListening()

開始聽會初始化一切,然後調用繼續收聽。您打電話的地方現在開始聆聽,然後致電繼續聆聽。

或者如果您想一次允許多個號碼,只需撥環路中的BeginAccept呼叫。這將永遠接受所有傳入連接,即使其他人已連接。這就是爲什麼它畢竟是異步的!

這是你的成員變量

public Socket Handler; 
private socket listener; // added by corsiKa 

這是你新的開始方法

public void StartListening() 
{ 
    // Establish the locel endpoint for the socket 
    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port); 

    // Create a TCP/IP socket 
    listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    try 
    { 
     // Bind the socket to the local endpoint and listen 
     listener.Blocking = false; 
     listener.Bind(localEndPoint); 
     listener.Listen(100); 

     // Start an asynchronous socket to listen for connections 
     performListen(listener); // changed by corsiKa 
    } 
    catch (Exception e) 
    { 
     invokeStatusUpdate(0, e.Message); 
    }    
} 

這是你的執行監聽方法

// added by corsiKa 
private void performListen(Socket listener) { 
    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
} 

這是你的新的接近方法

// variable name changed by corsiKa 
public void CloseNode(bool acceptMoreConnections) 
{ 
    try 
    { 
     if (Handler != null) 
     { 
      Handler.Shutdown(SocketShutdown.Both); 
      Handler.Close(); 
      Handler.Dispose(); 
      Handler = null; 
     } 
     // changed by corsiKa 
     if (acceptMoreConnections) 
      performListen(listener); 
    } 
    catch (Exception e) 
    { 
     invokeStatusUpdate(0, e.Message); 
    } 
} 
+0

我一次只想要一個連接。我不確定我會在哪裏拆分方法來執行您的建議。我應該讓全局套接字並使用'ContinueListening'方法簡單地調用'BeginAccept'? – 2013-02-28 17:40:21

+0

你實際上可以用if(重新啓動)listener.BeginAccept(新的AsyncCallback(AcceptCallback),listener)替換你的'if(restart)startListening();''顯然這需要提供對套接字的訪問。 – corsiKa 2013-02-28 17:43:01

+0

添加代碼。我不是一個C#人,我是一個Java人。所以一些語法可能是錯誤的。但我想有一個問題,它會很容易修復。 – corsiKa 2013-02-28 17:47:00