2016-05-22 17 views
0

TCPを介して私のカスタムフォーマットで完全なバイトパケットを送信する必要があります。しかし、私は正しくTCPがストリーミングプロトコルであることを理解しているので、sendメソッドを送信側で呼び出すときは、recv(これはNagleのアルゴリズムと一緒にマージすることができますし、次に受信側で同じサイズで受信されるという保証はありませんフレームに収まらないときや、バッファに収まらないときは分割されます)。TCPを介して "データグラム"を送信するための構造的な正しい方法

UDPは完全なデータグラムを提供するため、このような問題はありません。

質問があります:recvと同じパッカーがsendと同じサイズで、接着剤を使用しないでください。私はPythonを使って開発する。

私はHDLCのようなものを使うことができると思いますが、各バイトを繰り返し処理するのが最良の選択であるかどうかはわかりません。 この状況では、オープンソースの小さな例がいくつかあるのでしょうか、それとも書籍に書かれていますか?

+0

「接着剤なし」とはどういう意味ですか?個々のテレグラムの始まりと終わりを示すインジケータはありませんか?その場合、なぜですか?これは、この種の状況を解決する最も一般的な方法です。 – fvu

+0

「いいえ、いいえ」とは、1つのストリームチャンクで複数のテレグラムを持つストリームチャンクではなく、個々のテレグラムを取る必要があるということです。さて、一般的な方法は、いくつかのインジケータ(いくつかのバイト)を送信側の私のパケットの間に追加し、それを受信側で解析することです?このバイトがパケットに存在する場合、私はそれをエスケープする必要があります。効率的ではないように見えますが、私はそれを考慮します。私はまた、パケット間に実際のパケットサイズを追加して、次のフルパケットに必要なバイト数を知り、それが現在のチャンク内のパケットであるか次のパケットであるかを判断するのに役立ちます。 – user3479125

+1

参照:https://en.wikipedia.org/wiki/Type-length-value –

答えて

2

TCPは唯一のオクテットストリームであるため、データ(フレーミング)やデータ内部(クリアエンドの構造)の周囲には接着剤なしではできません。

一般的なやり方は、区切り文字(HTTPヘッダーと本文の間に\r\n\r\nなど)を付けるか、メッセージにプレフィックスを付けることです。後者の場合、サイズ(固定バイト数)を読み取り、実際のメッセージのこのバイト数を読み取るだけです。

関連する問題