着信接続をリッスンするソケットを設定しています。
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 メソッドは、さらに着信接続のリッスンを開始する必要があるかどうかを知るためにブール値を取ります。
問題は、メソッドに戻ると、 「通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の使用は 1 つだけ許可されている」というStartListening
行で例外が発生することです。listener.Bind(localEndPoint);
リスニングを再開するにはどうすればよいですか?