3

1) ソケットは、プロセスが終了するまで LocalEndPoint からバインド解除されないようです。
2)他の質問の解決策を試しましたが、少し待ってみましたが、役に立ちませんでした。
3)現時点では、ソケットとその接続を取り除くために以下を試しました:

public static void killUser(User victim)  
    {  
        LingerOption lo = new LingerOption(false, 0);  
victim.connectedSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger,     lo);  
        victim.connectedSocket.Shutdown(SocketShutdown.Both);  
        victim.connectedSocket.Disconnect(true);  
        victim.connectedSocket.Close();  
        clients.RemoveAt(victim.ID);  
    }  

4) 少しグーグルで検索した後、ポートのバインドを解除できないようです。したがって、十分な量の接続クライアントがある場合、最終的にリッスンするポートが不足します。

4

1 に答える 1

9

接続されているクライアントのソケットとサーバーのソケットを混同しているのではないかと思います。

サーバーソケットは、特定のポートで着信接続をリッスンするものです。その関数で閉じるソケットは、(潜在的に多くの)リモート接続の1つへのパイプです。

「ポートのバインドを解除」するには、サーバーソケットをシャットダウン/閉じる必要があります。

混乱を解消するために更新する

.Bind(EndPoint)を呼び出した後、.Listen()を呼び出した「サーバー」ソケットが必要です。これは、シャットダウン/クローズして「バインド解除」し、後で使用できるようにポートを解放するソケットです。

次に、「サーバー」ソケットが新しい接続を受け入れるたびに参照を取得する複数の「クライアント」ソケットがあります。これらはすべて問題なく同じポートにバインドできます。これらの接続の1つを閉じてクライアントを切断するには、現在行っていることを実行します。実際には、メソッドを次のようにトリミングできます。

  • シャットダウン
  • 選ぶ
  • リストから削除する

切断して残りは不要です。

于 2011-01-07T06:34:47.667 に答える