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 是一种协议。仅仅因为您通过一次调用发送了数据并不意味着它将作为一个数据包发送,或者它不会与其他数据包合并。换句话说,发送“X”然后“Y”相当于发送“XY”——它们很可能使用完全相同的数据包传输,与另一端无法区分。

如果您想要流中的单个“消息”的概念,您应该在数据前面加上几个字节明确说明其长度。(另一种方法是使用分隔符,但我更喜欢使用长度前缀 - 它可以更轻松地了解您仍然需要接收多少数据,您无需担心开始使用下一条消息,而且您不必担心以某种形式转义分隔符。)

于 2010-01-03T16:06:18.320 回答
0

仅当传输某些内容以传达长度时 - 要么将长度预先添加到消息中,要么发送某种终止符。

于 2010-01-03T16:05:59.803 回答