setsockoptを正しく使用しているのに、
どうしてもbindエラーになってしまう。
エラーの原因は、
Already in usedみたいな感じで
前回ソケットを使用した時に
上手く閉じれていないと起こります。
コンパイルして、
いざ実行しようとしたら、
bindシステムコールでエラーになる。
面倒ですよね!?
もう一度コードを見直しましょう。
思い込みしているだけで、
setsockoptを間違った使い方を
しているかもしれません。
それでもよく分からない!!!
簡単な解決方法をご紹介します。
lsofコマンドとkillコマンド
この2つを使います。
lsofコマンドとkillコマンド
lsofは LiSt Open File です。
オープン中のファイルや
そのファイルをオープンしている
プロセスのリストを
出力するコマンドである。
(※Wikipediaより)
何もしていないように
見えてもその裏では、
たくさんのファイルが
開かれて実行されてます。
lsofをそのままま実行すると、
たくさんのファイルが
ずらーっと表示されます。
この記事を読んでいただいている
ということは、ソケット関連で
エラーを起こしている方だと思います。
-i オプションを指定することで、
ソケット関連に絞ることが出来ます。
bindでエラーを起こる状況を作って
実際にやってみます。
lsof -i とタイプします。

すると6個のリストが表示されました。
この中で、./a.outのプロセスを
無理やり閉じてやれば
bindのエラーが解消されます。
ここで登場するのが、
killコマンドです。
システム上で動作している
プロセスに簡単なメッセージを
送信するコマンドです。
ただkillしただけだと、
終了意味するシグナルが
プロセスに送信されます。
上の画像のように、
プロセスIDを指定して、
killコマンドを叩きます。
ところがどうでしょうか。
もう一度、lsofコマンドで
確認してみましょう。
./a.outがまだ残ったままです。
この状態では、
bindでエラーは起きます。
実は、オプションなしのkillは、
SIGTERMというシグナルを送ります。
このシグナルではプログラム側で
上手く対処出来ないことがあります。
ちなみにSIGTERMは、
シグナル番号15です。
プロセスを強制終了させるためには、
SIGKILLシグナルを使います。
このシグナル番号は9なので、
killに -9 オプションを付けます。
オプション番号によって、
送信するシグナルが異なります。
それでは実際に、
送信してみましょう。

kill -9 [PID]
と叩くだけです。
lsofコマンドで、
再度確認してみましょう。
プロセスが終了している
ことが分かります。
これでbindするときに
エラーを起こさずに実行できます。
話がそれますが、
killコマンド以外で、
よく使われるシグナルは、
SIGTSTPだと思います。
これはショートカット: Cntl + z を
押したときに送信されるシグナルで、
一時停止の信号を意味しています。
シグナル番号は20番です。
最後まで読んでいただきありがとうございました。