0

TCP ストリームを介してバイナリ データを読み取る単純なクライアントを作成しています。ファイルは部分ごとに送信されるため、次のようなループがあります。

while (1 /* Maybe a check for EOF or if the socket is closed here ? */) {
  ssize_t bytes_red = recv(
  if (bytes_read <= 0) // not working properly ?
    break;
  ...
}

読み取りは、受信したバイト数を返す recv() メソッドを介して行われます。アイデアは明らかに、TCP ストリームが開かれている限りデータを読み取ることですが、上記のアプローチは私にはうまくいかないようです。

他のアイデアはありますか?ストリームが閉じられるかEOFが発生するまでソケットから読み取るクリーンな方法は何ですか?

編集:上記のアプローチは正常に機能します。他の場所にバグがありました。

4

1 に答える 1

5

recv()ソケットが適切に閉じられた場合は 0 を返し、エラーが発生した場合は -1 を返します。したがって、recv()返されるまで読み取ります<=0。投稿されたコード スニペットは正しいように見えますが、なぜ機能していないと思いますか? 何が起こるか、あなたは何を期待していましたか?

ソケットがノンブロッキングの場合、recv()-1 を返し、またはerrnoに設定される場合も処理する必要があります。これは、ソケットがまだ正常に動作していることを意味しますが、現時点ではデータがありません。EAGAINEWOULDBLOCK

于 2011-04-12T18:42:11.193 に答える