サーバ側で、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