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 の両方で問題なく動作しました。