2016-12-15 13 views
1

cプログラミングで読み込みブロック機能を使用している間にペイロードを異なるパケットから区別する方法はありますか?私はTCPクライアントからのパケットで各メッセージを送信しています。読み込み機能を使用してTCPサーバーで読むと、その間に区切り文字なしですべてのメッセージがバッファにまとめられます。ソケットプログラミングでの読み取りの使用

+3

TCPはストリーム指向です。アプリケーションに関する限りパケットはありません。中断のないバイトストリームのみです。プロトコルの下位レベルのパケットは任意の中間パーティによって自由に分割してマージすることができますので、それらを見るのは無意味です。 –

答えて

4

あなたはアプリケーション層でそれを実装する必要があります。

1つのアプローチは、例えば、タイプ長さ値です。

あなたが送る各メッセージには、以下の構造を有している。

1 byte | 2 byte | length bytes 
type length value 

詳細hereを。

readは、指定されたバイト数を正確に読み取れないため、読み込み回数が少なくなるため、戻り値を確認する必要があります。たとえば、thisを参照してください。

バイナリプロトコルにはいくつかの問題がありますが、awareのものがあります。

また、ネットワークプログラミングに関するバックグラウンドの読み方もお勧めします。 here - 第7章を参照してください。

+0

クライアントがPUTTYまたはtelnetのようなものなら、それを行う方法はありますか? – Govindh

+0

@Govindh区切り文字をそこに置く必要があります。 –

+0

T-L-Vはこの作業のための好ましい方法です。サードパーティのツールを使用している場合は、T-L-Vを使用するか、メッセージの終わりを伝えるために何らかの区切り文字を使用することがあります。これは、TCPが固有のメッセージ境界を持たないバイトストリームプロトコルであるため必須です。 Telnet私はCR LFデリミタ(http://www.freesoft.org/CIE/RFC/1123/31.htm)を使用していると思います –

2

TCPはストリーム指向です。つまり、パケットを分離することはできません。つまり、各パケットを送信する前に4バイトのヘッダーデータを送信するなど、プロトコルを実装する必要があります。受信側では次のパケットサイズを受信者に伝えます。受信側では、次のパケットサイズを識別する4バイトのヘッダーを常に読み込み、ヘッダーに指定されたサイズでブロック読み取りを行う必要があります。

固定サイズのパケットを使用することもできます。これは、固定サイズのパケットをTCPバッファから読み取る必要があるたびに発生します。

UDPとは異なり、UDPはパケットの向きになっています。 UDPパケットでは、送信されたサイズで受信され、他のバッファリングや連結は行われませんが、その信頼性はありません。

関連する問題