0.概要
C言語実装において、ネットワークソケットに対してclose()をコールすると通常FINが発行されるが、TCPコネクションがTIME_WAITになって処理が遅いなどRSTで強制切断したい場合がある。
1.方法
ソケットに対して、ソケットオプションSOL_SOCKET, SO_LINGERを設定する。
linger on, タイムアウト値0にするとRSTが送信される。
int force_close(int sock)
{
int ret = 0;
struct linger ling;
memset(&ling, 0, sizeof(ling));
ling.l_onoff = 1; /* 0以外でon, 0でoff */
ling.l_linger = 0; /* 0で即時切断。0以外は指定時間(秒)でタイムアウト */
ret = setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
if(ret != 0) {
printf("setsockopt:%s\n", strerror(errno));
}
ret = close(sock);
return ret;
}