UNIX ローカル ソケットに問題があります。一時バッファ サイズよりも長いメッセージを読み込んでいるときに、リクエストに時間がかかりすぎます (場合によっては無期限に)。
いくつかのテストの後に追加: ::recv でのフリーズにまだ問題があります。(1023*8) バイト以下を UNIX ソケットに送信した場合 - すべて問題ありませんが、(1023*9) を超えて送信した場合 - recv コマンドでフリーズします。 おそらく、FreeBSD のデフォルトの UNIX ソケット制限または C++ のデフォルトのソケット設定でしょうか? 誰が知っていますか?
私はいくつかの追加テストを行い、::recv コマンドを実行し、メッセージ >= (1023*9) バイトの長さを読み取ろうとすると、最後の 9 回目の繰り返しで「フリーズ」することを 100% 確信しています。(最初の 8 回目の繰り返し g はうまくいきます。)
私がやっていること: アイデアは、ソケットから do/while ループを読み込むことです
::recv (current_socket, buf, 1024, 0);
buf
SPECIAL SYMBOLをチェックします。見つからない場合:
- バッファの内容をマージする
stringxxx += buf;
- bzero temp buf
- ::recv ループを続ける
while ループでリクエストに時間がかかりすぎる問題を修正するにはどうすればよいですか?
バッファをクリアするより良い方法はありますか? 現在、次のとおりです。
char buf [1025];
bzero(buf, 1025);
しかし、新しい C++ 標準では bzero が非推奨であることは知っています。
EDIT: * 「なぜバッファをきれいにする必要があるのですか*
この質問のコメントで質問が表示されます。バッファへの読み取りの次の(最後の)繰り返しでバッファのクリーンアップを行わないと、メッセージの最初の部分の「テール」が含まれます。
例:
// message at the socket is "AAAAAACDE"
char buf [6];
::recv (current_socket, buf, 6, 0); // read 6 symbols, buf = "AAAAAA"
// no cleanup, read the last part of the message with recv
::recv (current_socket, buf, 6, 0);
// read 6 symbols, but buffer contain only 3 not readed before symbols, therefore
// buf now contain "CDEAAA" (not correct, we waiting for CDE only)