2011-08-01 12 views
2

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

+0

問題は送信側で受信側ではないことをどのようにして知ることができますか?本当の答えが必要な場合は、おそらくsendとreceiveの両方のサンプルコードを含める必要があります。 – antlersoft

+0

@antlersoft:コードはここではあまり重要ではありません。重要な概念です。 –

+0

ええ、今私はそれについて考えて、それは受信側のバイトの正確さをチェックすることがより合理的になります。しかし、私は同じ手順が読んでいる側で使用できると仮定しています。 – Sterling

答えて

3

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

1

私はあなたのことを正しく理解している場合、時には2つ以上のパケットを送信し、遠くの端で受信することがあります。

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

2

TCPにはこのような機能はありません。カーネル内のネットワークスタックには、TCP ストリームをパケットにスライスする方法があります。あなたはソケットにTCP_NODELAYオプションを設定して、Nagle algorithmを無効にすることができると言っています。 (;いくつかのコードは、これを明確だろうストリーム、FILEオブジェクトやファイル記述子を)しかし、あなたは、各メッセージを書きた後、あなたが明示的flush操作を行う必要があり、使用しているどのようなプラットフォームや、使用しているどのような構文

+0

私はそれを試みましたが、実際に何もしませんでした。しかし、将来の参考のための知識をありがとう。 – Sterling

+0

TCP_NODELAYは、小さなアプリケーション書き込み(telnet、rsh、sshは一度に文字を書く)で待ち時間を助けますが、特定のパケット化を保証しません。 –

1

わかりませんカーネルを強制する。私は一般にCスタイルのファイル記述子を使用していますが、通常は、記述子にfflushをコールすれば十分です。

関連する問題