C# void ReceiveData(IAsyncResult iar)

标签 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);

这里可以看出,可以找到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/

相关文章:

asp.net - 进程模型 minFreeThreads 澄清

c# - CA1008 : Enums should have zero value and Flag enums

c# - this.Invoke(...) - 这是不好的做法吗?

react-native - iOS 模拟器内的 Expo React Native 应用程序不断使用 socket.io 重新连接

sockets - 将 "Large"数据文件传输到服务器的简单 TCP 协议(protocol)

sockets - 如何配置Logstash 2.3.3 WebSocket

c# - 如何静态链接 C# 类库的库?

c# - 带有枚举的无效初始值设定项成员类

java - 从数据库提取数据时如何与 "future"同步

.net - IAsyncResult 接口(interface)的正确实现是什么?