揮発性のメモ2

最近知った知識を さも昔から知ってた風にメモ書きしていく

socatで、ソケットをRSTで終了させる

サーバ側で、readで読み出すときにエラーを発生させたい。

int len = read(fd, buf, size);
if(len<0) perror("グエー");  // これのテストをしたい

一番手っ取り早いのは、ちゃんとした切断ではなく RSTを送り付けて強制切断し ECONNRESET(Connection reset by peer)を引き起こす。
socat を使って、TCP接続をしてから2秒後に RSTで強制切断する。

 timeout -s KILL 2s socat - TCP:192.168.101.88:30101,linger=0


ポイントは2つ

linger=0

SO_LINGER 設定と同じ効果がある。つまり closeを即時タイムアウト扱いし、即RST送信になる。
socat -ddd などでデバッグ情報を見てるとちゃんと

setting option "so-linger" to {1,0}

と出ているので良くわかる。

timeout -s KILL

しかし、socatのオプション -T とかでタイムアウトさせると、即RSTではなく なんかFINを送ってしまうので サーバ側はまっとうな切断処理をおこなってしまう。
(その結果 readは エラー(-1)でなく 切断(0)になる)
これを避けるために、TERMではなくKILLによって殺すことで FINを送らせない。ソケットにはlinger=0が付いてるので即RST