通常の TCP 接続は、4 ウェイ ハンドシェイクです。
http://en.wikipedia.org/wiki/Transmission_Control_Protocol
クライアントを強制終了すると、FINセグメントがクライアント側からサーバーに送信され、サーバー プロトコル スタックがACKを送信します。
ここで、サーバーがデータを読み取ろうとした場合、読み取り呼び出しは値 0 を返すため、サーバー プログラムはピアが閉じたことを認識でき、通常はその後接続ソケットを閉じます。これにより、サーバー側からのFINが送信され、クライアント側からの最後のACKの受信後に通常の 4 ウェイ ハンドシェイクが完了します。
( http://www.faqs.org/faqs/unix-faq/socket/の Q 2.1 をお読みください)
ただし、ここではサーバーからデータを書き込んでいるため、サーバーはデータを送信した後にのみクライアントからRESETを取得しています。そのため、2 番目の送信にある最初の送信操作の後にエラーが発生しています。
では、pl。サーバー側で send の最初の呼び出しでエラー (EPIPE とは異なる場合があります) を取得できるように、linger オプションとタイムアウトを 0 に設定して、4 ウェイ ハンドシェイクの代わりにクライアント側からの接続を突然閉じてみてください。 (これは推奨される方法ではありませんが、この特定のケースを理解するためだけのものです)
Try the following option of nc, nc -L 0 to set the linger option and timeout to 0
(私はncのこのオプションを試していません。このリンクで詳細を確認してくださいhttp://docs.oracle.com/cd/E23824_01/html/821-1461/nc-1.html)
上記サイトのncの例、
Connect to TCP port, send some data and terminate the connection with
TCP RST segment
(instead of classic TCP closing handshake) by setting the linger option and
timeout to 0:
$ echo "foo" | nc -L 0 host.example.com 22