0

TCP ソケットを使用して、私のクライアント/サーバーは、メッセージがクライアントから送信され、サーバーがそれらを受信して​​ファイルに書き込む状況にあります。私が直面している問題は、メッセージが分割されているにもかかわらず、何らかの理由で、それらがすべて 1 行で受信されていることです。

たとえば、次のようにテキスト ファイルを 1 行ずつ送信するとします。

socket->write(msg.toUtf8().constData());
    socket->waitForBytesWritten(5000);

サーバーは、1 回の受信で複数のメッセージを受信することがあります。

したがって、テキスト ファイルに次のように記述されているとします。

こんにちは、

これはクライアントです

時々、サーバーは「こんにちは、これがクライアントです」を受信し、両方のメッセージが別々であるべきなのに一緒に受信します。

誰かが私が間違ってコーディングしたと言うかもしれませんが、奇妙なことに、クライアント/サーバーをローカルでテストすると、すべて完璧に動作します。ネットワーク経由で行うとすぐに、この問題が発生し始めます。メッセージの送信間に遅延を追加して、いくつかのテストを行いました。これでも問題は修正されましたが、メッセージごとに遅延を約 1 秒に増やした後でのみです。大量のメッセージを送信する必要がある場合、これは問題であり、1 秒ごとに最終的に長い時間がかかります。

4

1 に答える 1

4

TCP はストリーミングプロトコルであることを思い出してください。自然なメッセージ境界はなく、データは単なるバイト ストリームです。

メッセージを分離したい場合は、これらの境界を含む TCP の上にプロトコルを追加する必要があります。テキストの場合、改行は自然な境界であり、多くのテキストベースのプロトコルで使用されています。

于 2013-02-18T08:01:39.283 に答える