server側 | client側 | |||
socket() | socket() | |||
接続待ちソケット作成 | 通信用ソケット作成 | |||
setsockopt() | setsockopt() | |||
ソケットオプション設定 ※TIME_WAIT対策にSO_REUSEADDRを設定 |
ソケットオプション設定 ※TIME_WAIT対策にSO_REUSEADDRを設定 |
|||
bind() | bind() | |||
アドレス割付 | アドレス割付(省略可) | |||
listen | ||||
接続待ちキュー数設定(キュー数はOS上限が多くの場合5) | ||||
poll() | ||||
接続待ちソケットイベント発生待ち | connect() | |||
accept() | 接続要求(接続確立後復帰) | |||
接続確立& 通信用ソケット生成 |
||||
send()/recv() | send()/recv() | |||
データ送受信(poll()でのイベント発生待ちも可) ※回線切断はPOLLIN検出、recv()が0復帰&EINTR |
データ送受信(poll()でのイベント発生待ちも可) ※回線切断はPOLLIN検出、recv()が0復帰&EINTR |
|||
TIME_WAITになったソケットをSO_REUSEADDRオプションを使用することで利用した場合の調査報告。結論は「TIME_WAITが存在する間はbindできない,という問題は解決するが,TIME_WAITが消えるわけではない. あまりにも多くのソケットを短時間で利用すると, 多くのソケットがTIME_WAIT状態になってしまい, 利用可能なポートを使い切ってしまう,という問題の解決にはならない 」
level | level解説 | option | get/set | opton解説 | optval |
---|---|---|---|---|---|
SOL_SOCKET | SO_BROADCAST | get/set | ソケットでブロードキャスト送受信を行う場合に指定する。 | boolean型 1:ブロードキャスト送受信可 0:ブロードキャスト送受信不可 |
|
SO_REUSEADDR | get/set | ポート接続というアドレスを共有する2つのソケットを作成可能にする。TIME_WAIT状態になっているポート(bindしようとするとPort Already Usedのエラーとなる)をすぐに使用したい場合に指定する。詳細はこの報告記事を参照のこと。 | boolean型 1:共有可 0:共有不可 |
||
get/set | |||||
SOL_IP | get/set | ||||
get/set | |||||
get/set | |||||
SOL_IPV6 | get/set | ||||
get/set | |||||
get/set | |||||
SOL_TCP | get/set | ||||
get/set | |||||
get/set |