我希望对以下内容有所帮助。这与异步套接字有关。
来自发件人:
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);
我的问题是有没有办法访问发送数据的实际长度,并根据该调用接收数据,直到收到完整的消息?
答案 0 :(得分:7)
否 - TCP / IP是流协议。仅仅因为您通过一次调用发送数据并不意味着它将作为一个数据包发送,或者它不会与其他数据包合并。换句话说,发送“X”然后“Y”相当于发送“XY” - 它们很可能用完全相同的数据包传输,与另一端无法区分。
如果你想在流中想到一个单独的“消息”,你应该在数据前面加上几个明确说明其长度的字节。 (另一种方法是使用分隔符,但我更喜欢使用长度前缀 - 这样可以更容易地知道您仍然可以接收多少数据,您不必担心开始使用下一条消息,而且您不必担心以某种形式转义分隔符。)
答案 1 :(得分:0)
只有传输某些内容才能传达长度 - 要么预先设置消息的长度,要么发送某种终结者字符。