LoT ラブオンテック

非モテ男の、非モテ男による、【女の子にモテたい】非モテ男のためIT活用ブログ

プログラミング

【解決策】SO_REUSEADDRをsetsockoptにセットしているのにbind()エラーになるとき

投稿日:



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番です。






最後まで読んでいただきありがとうございました。


-プログラミング

Copyright© LoT ラブオンテック , 2020 All Rights Reserved Powered by STINGER.