1

Linux では、以下の手順を試しました。

  1. TCP ソケットを作成し、任意の HTTP サーバーに接続します
  2. HTTP リクエスト データを送信する
  3. SHUT_WR による書き込みのシャットダウン
  4. ソケットから読み取って HTTP 応答を取得する
  5. SHUT_RD によるシャットダウン読み取り
  6. ソケットを閉じる

ここでは、ステップ 5 でエラーが発生し、errno=ENOTCONN が指定されています。EOF を読み取った後に Write をシャットダウンしようとしたときに、同じエラーが発生しました。これは期待されていますか?

4

1 に答える 1

0

ステップ 4 で、recv() または read() を 0 が返されるまでループした場合は、ソケット クローズの残りの半分をすでに消費しています。今回を除いて、それはリモート エンドによって開始されました。これはおそらく、手順 5 でエラーが返される理由を説明しています。リモート エンドポイントが接続のその側を既に閉じているため、シャットダウンするものは何もありません。

いずれにせよ、手順 6 でソケットを閉じているため、手順 5 は必要ありません。「閉じる」は、TCP 接続の残りの部分をシャットダウンし、ソケット ファイル記述子を閉じます。

于 2012-12-17T18:12:33.517 に答える