1

次のことについて助けてほしい。これは、非同期ソケットと関係があります。

送信者から:

string stringData = "Welcome to my server server server";
byte[] message1 = Encoding.ASCII.GetBytes(stringData);

//MessageBox.Show(message1.Length.ToString());

client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);

ここでわかるように、message.length を見つけることができます。

--

クライアントで:

  Socket remote = (Socket)iar.AsyncState;
  int recv = remote.EndReceive(iar);
  string stringData = Encoding.ASCII.GetString(data, 0, recv);

私の質問は、送信されたデータの実際の長さにアクセスし、その呼び出しに基づいて、完全なメッセージが受信されるまでデータを受信する方法はありますか?

4

2 に答える 2

7

いいえ - TCP/IP はストリームプロトコルです。1 回の呼び出しでデータを送信したからといって、それが 1 つのパケットとして送信されるわけでも、他のパケットとマージされないわけでもありません。言い換えれば、「X」を送信してから「Y」を送信することは、「XY」を送信することと同じです。これらは、まったく同じパケットで送信され、相手側では区別できない可能性があります。

ストリーム内の個々の「メッセージ」のアイデアが必要な場合は、データの長さを明示的に示す数バイトをデータの前に付ける必要があります。(代わりに区切り文字を使用することもできますが、私は長さのプレフィックスを使用することをはるかに好みます。これにより、まだ受信する必要があるデータの量を簡単に知ることができます。次のメッセージの消費を開始することを心配する必要はありません。区切り文字を何らかの形でエスケープすることを心配する必要はありません。)

于 2010-01-03T16:06:18.320 に答える
0

長さを伝えるために何かが送信される場合のみ - メッセージの長さを前に追加するか、何らかのターミネータ文字を送信します。

于 2010-01-03T16:05:59.803 に答える