TCPソケットを作成しているので、少量のデータを送信する場合は問題ありません。フラグメントはありません。すべてのデータが1つのパッケージに含まれていました。しかし、データがどんどん大きくなるとき。TCPパッケージは細かく分割されています..それは本当に迷惑です。ソケットに設定するオプションはありますか?ソケットは自動的にピースを1つのパッケージに入れてくれますか?
7 に答える
これはバイトストリームです。すべてのバイトは正しく正しい順序で到着しますが、必ずしも必要なときに到着するとは限りません。1バイトよりも複雑なものを送信する必要がある場合は、TCPに加えて別のプロトコルが必要です。そのため、HTTP、SMTPなどの他のすべてのTCP/IPプロトコルがあります。
いいえ、ありません。1バイトを受け取る場合もあります。
TCPは、信頼性の高い双方向バイトストリームを提供します。シーケンス処理、トランスポート層のパケット化、再送信、およびフロー制御を処理します。何十年にもわたる研究が、そのパフォーマンスの最適化に向けられました。かなり気の利いた。この便利さのために支払う小さな代償は、ストリームをループで読み書きし、受信時に処理できる完全なアプリケーションプロトコルメッセージを監視し、送信時にまだバッファリングされていないバイトをフラッシュする必要があることです。
ZMQなどの高レベルのメッセージングライブラリの使用を検討してください。それはあなたのためにすべてのメッセージのパッキングとアンパックを処理します。
ソケットプログラミングへようこそ!
ここでチャイムを鳴らして、アプリケーションプロトコルを処理するライブラリへの依存関係を追加せずに、問題を解決するためにできることはほとんどないと言います。役立つかもしれないいくつかの低レベルのメッセージパッキングライブラリ(とりわけグーグルのプロトコルバッファ)があります。
ループ内のTCPデータの読み取りと書き込みに慣れるのがおそらく最も有益です。実績があり、非常に移植性があります。実際にストリーミングコーデックを自分で作成するのに少額の費用を払っても。
数回試してください。これは、再利用できる便利なエクスペリエンスであり、一度コツをつかめば、それほど難しくなく、煩わしいものでもありません(他のものと同じように)。
さらに、ユニットテストはかなり簡単です(難解なライブラリや、文書化されていない/まばらに文書化されたオプションを持つ珍しいプロトコルを扱うよりも)。
setsockopt()
とを使用して低透かしを設定することにより、ソケット読み取りを最適化して、それをサポートするプラットフォームでより大きなチャンクを返すことができます SO_RECVLOWAT
。ただし、透かしよりも少ないバイトを取得する可能性を処理する必要があります。
私はあなたが欲しいと思いますSOCK_SEQPACKET
(またはおそらくSOCK_RDM
)。socket(2)を参照してください。