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);
。
我該如何着手設置我的收聽再次開始收聽?
我一次只想要一個連接。我不確定我會在哪裏拆分方法來執行您的建議。我應該讓全局套接字並使用'ContinueListening'方法簡單地調用'BeginAccept'? – 2013-02-28 17:40:21
你實際上可以用if(重新啓動)listener.BeginAccept(新的AsyncCallback(AcceptCallback),listener)替換你的'if(restart)startListening();''顯然這需要提供對套接字的訪問。 – corsiKa 2013-02-28 17:43:01
添加代碼。我不是一個C#人,我是一個Java人。所以一些語法可能是錯誤的。但我想有一個問題,它會很容易修復。 – corsiKa 2013-02-28 17:47:00