0

FTP クライアントを作成しようとしていますが、コマンドに対するサーバーの応答を出力する必要があります。これらのコマンドの 1 つが STAT です。サーバーは応答を返します。私が理解しているように、応答は read() コマンドを使用して読み取ることができるソケットバッファーにあります。問題は、STAT の応答のみが必要なため、END OF STATUS で終了することがわかっていることです。これは、応答を読み取るために私が書いたコードです。

in = read(connFd, &timebuffer, sizeof(timebuffer));;
while(in>0){
    printf("%s", timebuffer);
    memset(&timebuffer, 0, sizeof timebuffer);
    in = read(connFd, &timebuffer, sizeof(timebuffer));
}
memset(&timebuffer, 0, sizeof timebuffer);

私が得ている問題は、 read() 関数がバッファを通過し、 while ループの読み取りが終了すると、ループが終了せず、無限に続くと、プログラムがそこに留まることです。read() 関数がデータを待っているためだと思いますので、バッファの終わりに達したら read() を停止するように指示する方法があるかどうか疑問に思っていました。read() は x<1 を返すため、これは自動的に発生すると思いましたが、待機中の場合は問題が何であるかを理解しています。では、どうすれば修正できますか?timeout(0) を設定して、データが既に存在する場合にのみデータを読み取る方法はありますか? また、0に設定した「フラグ」があることは知っていますが、それらに関する情報はあまり見つかりません。助けていただければ幸いです。唯一の方法は、バッファ内の「END OF STATUS」文字列をチェックすることですか? strstr(buffer) を使用しますか

4

1 に答える 1

1

readはブロッキング呼び出し (ソケットを非ブロッキングに設定していない限り) であるため、要求した正確なバイト数を受信した場合、またはソケットが閉じられた場合にのみ返されます。

ソケットがノンブロッキングに設定されている場合、「読み取り」にゼロ リターンが返されますが、プログラムが確実にネットワークよりも高速であるため、応答の最後に到達していない場合でも、ゼロ リターンが返されることがあります。

補足として...strstr()すべての読み取りを連結しないと使用できません。1 回の読み取りで終了メッセージの 1/2 を取得し、次の読み取りで残りを取得できます。

于 2012-10-04T13:22:37.743 に答える