2010-12-11 18 views
2

興味深いCソケットの問題が発生しました。Cソケット - 一度に複数の文字列をランダムに受信

私は入ってくる文字列を受信して​​いて、最初の2〜4文字列に対して同時に3つの文字列をランダムに受信することに気付きました。

たとえば、次の受信文字列を受信して​​います。

1~message~i love you\r\n 
2~message~do you love me?\r\n 
3~message~when are we going to meet again?\r\n 
4~message~How about now?\r\n 
5~message~Oh! I'm pregnant!\r\n 

私は、受信したメッセージの数を追跡するカウンタを追加し、カウンタは時々が最初の3つの文字列をカウントしないことに気づきました。例

1~message~i love you\r\n 
->Line 1 received 
2~message~do you love me?\r\n 
3~message~when are we going to meet again?\r\n 
4~message~How about now?\r\n 
->Line 2 received 
5~message~Oh! I'm pregnant!\r\n 
->Line 3 received 

次の行番号

int lineNo = 1; 
while ((recvBytes = recv(clntSockfd, buffer, sizeof(buffer), 0)) > 0) { 
    printf("%s", buffer); 
    memset(&buffer, 0, sizeof(buffer)); 
    printf("Line %d received\n", lineNo++); 
} 

を印刷するための私のコードであるために私は私がJava NIOでコーディングされたときに、この問題は表示されませんでしたので、なぜこの出来事があるか分かりません。

アイデア、人々?

答えて

0

どのような接続タイプを使用していますか?

UDPはほとんどの場合信頼性がありません。

TCPは、信頼性の点でUDPよりはるかに優れています。

+0

Hey Neilvert、TCPを使用しています。 – Poliquin

1

あなたは行末までは読んでいません。 bufferは、複数行のを含むことができます。

8

TCPを使用していると仮定すると、あなたのケースのrecv()呼び出しを「メッセージ」(または「回線」)に関連付けることに欠陥があります。 TCPは、概念的にはバイトのストリームです。送信オペレーティングシステムは、受信オペレーティングシステムが1つのrecv()呼び出しとして複数の着信パケットを自由に報告できるように、複数のsend()呼び出しを1つのIPパケットにまとめて自由に使用できます。それは、受信パケットをrecv呼び出しの間で分割することを選択することさえできます。

実際には、データ自体にメッセージ構造を入れる必要があります。受信したデータの改行をスキャンします。

これはJavaで発生しなかったことは純粋な運でした。

+0

ループバックでは、送信されたサイズのパケットを取得する傾向があります。しかし、実際のネットワーク上では、パケットの合体を避けることは非常に困難です。約100ミリ秒間隔でパケットを送信すると、通常は送信されたサイズのパケットが取得されますが、この動作に頼るべきではありません。 –

+0

ねえ、ヘッドアップのおかげで。私はマーチンが提案したような改行をスキャンすると思います。私の夕食中にそれについて考えていた。私が戻ってきたので、おそらくもう少し詳しく話をするでしょう。 strtok()とstrtok_r()を見ていました。 strtok_r()は、ドキュメントがスレッディングに適していると言っているので、より良いベットのように見えます。さらに、私は文字列 "1〜メッセージ〜私はあなたを愛しています\ r \ n"を "1" "メッセージ" "私はあなたを愛して"の各トークンに分割しようとしています。 – Poliquin

関連する問題