我需要以下方面的帮助。这与异步套接字有关。
来自发件人:
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);
我的问题是有没有办法访问已发送数据的实际长度,并根据该调用接收数据,直到收到完整的消息?
最佳答案
否 - TCP/IP 是一种流 协议(protocol)。仅仅因为您通过一次调用发送了数据并不意味着它将作为一个数据包发送,或者它不会与其他数据包合并。换句话说,先发送“X”再发送“Y”等同于发送“XY”——它们很可能使用完全相同的数据包传输,而另一端无法区分。
如果您想要流中的单个“消息”的想法,您应该在数据前加上几个字节以明确说明其长度。 (另一种方法是使用定界符,但我更喜欢使用长度前缀——这样可以更容易地知道您还需要接收多少数据,您无需担心开始使用下一条消息,而且您不必担心以某种形式转义分隔符。)
关于C# void ReceiveData(IAsyncResult iar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1995388/