setsockopt

setsockoptは、ソケットのオプション設定をするUNIXシステムコール・・・。

Man page of GETSOCKOPT

よく使うオプションとしては、SO_REUSEADDRが挙げられる・・・。

サーバプログラムで、同じポート番号でbindを繰り返すと、"Address already in use"が出て、失敗する事がある・・・。

Geekなぺーじ:TCPを使う(サーバ、SO_REUSEADDR)

そこで、setsockoptでSO_REUSEADDRを有効にすることで、再度同じポート番号でbindできるようにする・・・。

セットするオプションの値を格納するint型変数optvalを用意し、1に初期化・・・。

ソケットを作成し、addrの設定をする・・・。

setsockoptで、socに対して、SO_REUSEADDRを1(有効)にする・・・。
第2引数はオプションレベルというものだが、SOL_SOCKETは常に指定するので、これでいい・・・。

第4引数はSO_REUSEADDRの場合は、本来1バイトcharで指定するが、optvalがintなので、(const char *)にキャストしている・・・。
オプションによって渡す値の型が違うため、setsockoptの引数型はvoid *で定義されていて、第5引数にサイズも指定する・・・。
setsockopt

戻り値が-1ならエラー処理・・・。

成功したら"setsockopt(SO_REUSEADDR) success."を出力・・・。
続いて、bindする・・・。
そして、成功したら"bind success."を出力・・・。

$ ./setsockopt
soc = 3
setsockopt(SO_REUSEADDR) success.
bind success.
$ ./setsockopt
soc = 3
setsockopt(SO_REUSEADDR) success.
bind success.
$

bindを繰り返しても成功する・・・。

Sample/setsockopt.c at master · bg1bgst333/Sample · GitHub