プログラムが終了するときはOSがFINとか送ってくれるけど、途中でLANケーブル抜けたときとかはどうにもならないので
自分で切断を検知する必要がある。キープアライブを使って切断を検知する。
int option = 1; setsockopt( sd, SOL_SOCKET, SO_KEEPALIVE, (void*)&option, sizeof(option) );
デフォルトでは切断検知まで 2時間11分15秒。
2時間とか待ってると日が暮れるので、これをせめて3分とかにする
int option = 1; setsockopt( sd, SOL_SOCKET, SO_KEEPALIVE, (void*)&option, sizeof(option) ); option = 60; setsockopt( sd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&option, sizeof(option) ); option = 30; setsockopt( sd, IPPROTO_TCP, TCP_KEEPINTVL, (void*)&option, sizeof(option) ); option = 4; setsockopt( sd, IPPROTO_TCP, TCP_KEEPCNT, (void*)&option, sizeof(option) );
3つのソケットオプションについて
TCP_KEEPIDLE
キープアライブを最初に投げ始めるまでの時間(秒)。デフォルトは7200秒。
この秒数だけ無通信時間が続いたら、キープアライブパケットを投げはじめる。
/proc/sys/net/ipv4/tcp_keepalive_time