2011-12-05 2 views
0

私は自分のTCPクライアントをプログラミングしています。ちょっと変わっています。TCPが変わっています

クライアントの動作は、受信バイトの最後のバイトが\ 0文字かどうかを調べることです。そうであれば、バッファ内の以前のデータをテキストに変換し、そのテキストをイベントの引数としてトリガします。

しかし、2つの文字列を同時に送信しようとすると、何か奇妙なことが起こります。その場合、実際には1つの文字列として受け取られます。あなたが私に尋ねると、それは変です。

どうすればこの問題を解決できますか?

コードサンプルは含まれていないので、コードサンプルは含まれていません。あなたが主張している場合は、コメントを追加してリクエストしてください。投稿します。

+1

20〜30行で問題を再現できるかどうか...ストリーム上での送受信の仕組みを示すスニペットを含めることができます。 – sarnold

答えて

2

TCPを使用すると、接続の片側から複数のパケットを送信するときに何を記述していることは完全に正常ですストリームであり、反対側は同時にeverrythingを受け取ることができます。それは、パケットを連結するためにできるだけ試みるよう

まあWindowsカーネルは、この中にあなたに対して実際の戦いです。

TcpClient client = // something 
client.NoDelay = true; 

をしかし、あなたはそれのために準備しなければならないので、TCPは常に、ストリームを表します:あなたは、データを送信している側から(それはNagleアルゴリズムと呼ばれています)これを無効にしたい場合。あなたのケースでは

それはあなたが、返された文字列を解析し、すべての'\0'を見つけて、それらのそれぞれのためにイベントを送信する必要があることを意味します。

5

2つの文字列を同じソケットで2つの異なるスレッドから送信している場合は、それらはインターリーブされます。このためには、何らかのスレッド同期が必要です(.NETでは、lock()ステートメントが必要です)。または、2つの異なるソケットを使用します。

0

この:

私は同時に2つの文字列を送信しようとすると、しかし、奇妙な何かが起こります。

alöreadyは解決策を持っています。同時にそれらを送信しないでください。 2番目の文字列をキューに入れます。最初の文字列の後に終了します。これはbtwです。ネットワークの問題ではありません。ソケットAPIは、定義ごとにアトミックでスレッドセーフではありません。

2

私は間違っているかもしれませんが、あなたは実際にヌル(\ 0文字)なしで文字列を送信したと思われます。

クライアントがデータを受信すると、null文字が自動的に付加されて文字列が作成されます。

したがって、同時に2つの文字列を送信すると、ヌル文字なしで一緒にマージされます。受信側では、1つのヌルだけを持つ単一の文字列として再構築されます。

送信する前に、len + 1でデータを送信するか、文字列にヌル文字を挿入してみます。

+1

私は、TCPがストリームプロトコルであることを付け加えます。 'send()'の連続呼び出しは、データが単一のtcpフレームに追加される可能性があるので、 'recv()'からの複数の戻り値を意味しません。データは1つの連続したバイトストリームとみなされ、ストリームの別の部分を自分で分ける必要があります。 –

関連する問題