5

私はcのプロキシサーバーで作業しています。fread と fgets をさまざまな場所で組み合わせて使用​​することはかなりありましたが、その違いを調整して理解したいと思います。次の例では、以前に fget を使用して成功した場所で fread を使用しようとしています。代わりに、サーバーが fread 行でハングします。違いは何ですか?また、プログラムがハングするのはなぜですか?

void HandleTCPClient(int clntSocket)
{
    FILE *request = fdopen(clntSocket, "r");
    char reader[2000];
    size_t q; //typo before
    while((q=fread(reader, 1, sizeof(reader), request))>0) {  //hangs here!
        printf("i read something!\n");
    }
    return;
}

ありがとう!!

編集:だから、「while((q=fread(reader, 1, 1, request))>0) {」という行を作成すると

画面全体に「何かを読みました」と表示されます...

これが何を意味するのかわかりません。それで、少なくともバッファのサイズの文字数がストリームに存在しない場合、 fread は文字通り何もしないというのは正しいでしょうか?

4

2 に答える 2

4

fgetsfread要求されたバイト数がストリームまたはEOFで使用可能になるまでブロックされている間、改行が読み取られたときに戻ります。あなたの場合、ストリームに2000バイトのデータが用意されていないため、呼び出しがブロックされます。

于 2012-12-23T06:01:47.973 に答える
0

fread()TCPソケットで読み取る代わりに使用することはrecv()、私には奇妙に思えます。

とにかく、fread読むものがない限りブロックしています。select()たとえばLinuxを使用して、ソケットが読み取りまたは書き込みを実行する準備ができていることを常に確認する必要があります。

于 2012-12-23T06:05:09.267 に答える