iTE*_*Egg 1 c# sockets iasyncresult
我希望对以下内容有所帮助.这与异步套接字有关.
来自发件人:
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);
Run Code Online (Sandbox Code Playgroud)
在这里可以看到,可以找到message.length.
-
在客户端:
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Run Code Online (Sandbox Code Playgroud)
我的问题是有没有办法访问发送数据的实际长度,并根据该调用接收数据,直到收到完整的消息?
否 - TCP/IP是流协议.仅仅因为您通过一次调用发送数据并不意味着它将作为一个数据包发送,或者它不会与其他数据包合并.换句话说,发送"X"然后"Y"相当于发送"XY" - 它们很可能用完全相同的数据包传输,与另一端无法区分.
如果您想在流中获得单个"消息"的概念,则应该在数据前面加上明确说明其长度的几个字节.(另一种方法是使用分隔符,但我更喜欢使用长度前缀 - 这样可以更容易地知道您仍然可以接收多少数据,您不必担心开始使用下一条消息,而且您不必担心以某种形式转义分隔符.)
归档时间: |
|
查看次数: |
858 次 |
最近记录: |