2

一定の間隔(毎秒)でTCPソケットを介してメッセージを送信しようとしています。メッセージ全体が送信されない場合や、2〜4個のメッセージがスタックされて一度に送信される場合があります。戻り値が0または<0の場合のifステートメントがありますが、それらは決して真ではありません。send()の正確な戻り値をチェックして、送信されたバイト数が少ないか多いかを確認するという明白なアプローチを試しました。送信するバイト数が少なくても、送信するパラメーターで指定した数を返すだけです(これは、送信するバイト数が少なくなるまでブロックを送信する場合に意味があります)。それで、「正しいサイズのパケットが送信されましたか?いいえ?-何かをします」と言う正確な方法はありますか?

4

4 に答える 4

3

TCPは信頼性の高いバイトストリームを提供し、メッセージの境界はありません。メッセージの長さを知る必要がある場合は、これをプロトコルに組み込む必要があります。たとえば、メッセージの長さを指定する2バイトのヘッダーを使用してすべてのメッセージを送信します。

于 2011-08-01T15:05:08.580 に答える
2

TCPにはそのような機能はありません。TCPストリームをパケットにスライスする方法は、カーネル内のネットワークスタック次第です。ソケットにオプションを設定して、 NagleアルゴリズムTCP_NODELAYを無効にできると言っています。

于 2011-08-01T14:59:18.280 に答える
1

使用しているプラ​​ットフォームや使用している構文(ストリーム、オブジェクト、またはファイル記述子。一部のコードでこれが明確になります)はわかりませんが、カーネルを強制するために各メッセージを書き込んだ後FILE、明示的な操作を行う必要がある場合があります。私は通常、Cスタイルのファイル記述子を使用します。通常、記述子を呼び出して、キューに入れたものをすぐに削除するだけで十分です。flushfflush

于 2011-08-01T15:03:58.377 に答える
1

私があなたを正しく理解しているなら、時々あなたは2つ以上のパケットを送信し、それらは遠端で1つとして受信されます。

これがTCP/IPの性質です。パケットが順番に確実に到着することだけを保証することはできません。

于 2011-08-01T14:58:58.960 に答える