0

telnet クライアントに接続されているサーバー アプリケーションがあります (つまり、telnet localhost _port_num - ここでは、ポート番号はサーバー アプリケーションに関連付けられているものと同じです)。

私のアプリケーションは正しく動作しますが、問題は次のように recv を使用したことです。

#define BUFLEN 512
char buf[BUFLEN];
iResult = recv(sd, (char *)buf, BUFLEN, 0);

ここで、recv 呼び出しは、接続された telnet 端末で任意の文字が押されるとすぐに戻ります。ほとんどの場合、iResult は1またはです。Enter を押さ2なくても、telnet クライアントは単一の文字を含むフレームをサーバー アプリケーションに送信します。

BUFLEN read の後に recv が返されるようにするにはどうすればよいですか? Linux の recv が期待どおりに動作する場合は、ブロックを まで取得しますenter

どんな助けや指針も大歓迎です。

4

2 に答える 2

2

Q: どうすれば... BUFLEN read を確認できますか?

A: 期待するすべての文字を取得するまで、ループで読み取ります。または、タイムアウトまたはエラーが発生するまで。

于 2013-07-31T07:04:01.327 に答える
1

必要な量のデータが受信されるまで、 recv 関数を何度も呼び出す必要があります。TCP ソケットを使用する場合、1 回の受信呼び出しですべてのデータを受信したかどうかを確認できないことに注意してください。単一の TCP Send() 呼び出しを使用してデータを送信する場合、TCP ソケットはストリーム ソケットであるため、複数の受信でデータを受信する可能性は十分にあります。

recv() 関数は受信したバイト数を返すため、すべてのバイトを取得するまで関数を呼び出し続けることができます。

于 2013-07-31T07:50:49.817 に答える