GNU/Linux >> Linux の 問題 >  >> Linux

C でソケット接続を完全に破棄する方法

close call は、TCP ソケットが閉じられたことを示すだけです。プロセスではもう使用できませんが、カーネルは一定期間リソースを保持している可能性があります (TIME_WAIT、2MLS など)。

SO_REUSEADDR を設定すると、バインディングの問題が解消されます。

true の値を確認してください setsockopt を呼び出すと、実際にはゼロではありません (オーバーフロー バグで上書きされる可能性があります):

true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))

pid あります 変数はあなたのコードです。 fork を使用する場合 (接続処理プロセスを開始するため)、sock を閉じる必要があります。 それを必要としないプロセスでも。


最初に名前を付けます。つまり、同じものには同じ名前を付けます:

サーバー側:

listen() に渡されたソケット そして accept()リスニングと呼びましょう socket.accept() によって返されるソケット 承認済みと呼びましょう

クライアント側:

connect() に渡されたソケット connecting/connected を呼び出しましょう

あなたの問題について:

accept() を終了するには ed 接続 閉じる承認 ソケット (接続済みと呼ぶもの) オプションで最初に shutdown() を使用 続いて close () .

accept() への呼び出しの直前に新しい接続ループを受け入れるには 、しない bind()経由で行く と listen()

シャットダウンとのみ リスニングを閉じる 保留中を取り除きたい場合はソケット connect() accept() の後に発行された


接続されたソケットを閉じるのを忘れたため、接続はまだアクティブです。リスニング ソケットを閉じても、接続されているソケットは自動的に閉じられません。

//necessary code
close(connected);  // <---- add this line
close(sock);
goto label;

なぜEADDRINUSEを取得しているのかはわかりません。このコードは、Linux と Mac OS の両方で問題なく動作しました。


Linux
  1. LinuxでリモートMySQL接続を追加するにはどうすればよいですか?

  2. 特定のポートで実行されている rmiregistry を閉じるには?

  3. PHPRedis と PHP-FPM を使用しているときに pconnect() 接続を閉じたりリセットしたりする方法は?

  1. ssh ControlMaster 接続が使用されているかどうかを確認する方法

  2. インターネット接続を共有するには?

  3. UNIXソケット接続のもう一方の端を見つける方法は?

  1. SSH接続タイムアウトを増やす方法

  2. Linuxで応答しないSSH接続を終了する方法は?

  3. Linuxでポートを閉じる方法は?