3

これが起こるべきかどうかを述べる多くのドキュメントを見つけることができません:

  1. 一部のスレッドが TCP (または他のストリーム) ソケットを開きます
  2. スレッド 1 はブロッキング recv() を開始します
  3. スレッド 2 は SHUT_RDWR (または SHUT_RD だと思います) を使用してソケットで shutdown() を呼び出します
  4. スレッド 1 は、ブロッキング呼び出しから「目覚め」、相手がソケットを閉じた場合と同様に、0 を返します。

この動作は、最新の Linux および FreeBSD システムで発生します。私は他のものでそれをテストしていません。

ここの Microsoft MSDN ヘルプ ページに関するコメント: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspxは、この動作が "責任がある" ことを示唆しています。ウィンドウズ; これは「現在は当てはまらない」とも述べていますが、これは時代遅れである可能性があります。

この動作はどこかに指定されていますか? 私はそれを頼ることができますか?

4

1 に答える 1

1

あなたはそれに頼ることはできないと思います。shutdown() はソケットのシャットダウンを開始しますが、詳細は特定の状況に依存します。一部のプロトコルは、実際に接続とソケットをすぐに閉じて、そのソケットでスリープしているプロセスを起動する場合があります。それ以外の場合、シャットダウンは単にプロトコル ステート マシンを実行に移すだけですが、誰かを起こしてよい状態になるまでには時間がかかります。たとえば、確立された TCP 接続は、CLOSED 状態に達するまで、いくつかの状態を遷移する必要があります。最終的には目が覚めますが、すぐに起きるとは限りません。

于 2013-06-26T22:36:23.530 に答える