
TCP / IPポートから読み取る必要があるコードを実行すると、しばしば次のメッセージが表示されます(使用されている言語によって異なります)。
socket_bind(): unable to bind address
他のプロセスがこのポートを受信/バインドするときにこれが発生することがわかっているので(正確な説明フレーズはわかりません)、私のコードはそのポートを受信できません。しかしそれは私のコード(CTRL-C経由で)このポートをブロックするのをやめました!若干の時間制限があるようです。しばらく(約30秒)待ってからコードを起動して、問題なくこの特定のポートをリッスンできます。
私は知りたいです:
- コードを停止した後でもポートがブロックされ続けるのはなぜですか?
- コードを再起動してこのポートでリッスンを開始できるように、システムがこのポートを強制的に無効にするにはどうすればよいですか。
答え1
C / C ++について話しているとし、setsockopt()
を使用してくださいSO_REUSEADDR
。ポートをリッスンするアクティブなプロセスがない場合は、再利用できます。
編集:まだ機能する理由は、ソケットを正しく閉じていないためです。 Control-Cはそれを殺します。netstat
これを使用して、開いているポートまたは完全に閉じていないポートを確認できます。
http://www.beej.us/guide/bgnet/output/html/multipage/setsockoptman.html
https://stackoverflow.com/questions/10071107/rebound-a-port-to-datagram-socket-on-a-difftent-ip