【问题标题】:C# void ReceiveData(IAsyncResult iar)C# void ReceiveData(IAsyncResult iar)
【发布时间】:2011-01-01 00:14:47
【问题描述】:

我需要以下方面的帮助。这与异步套接字有关。

来自发件人:

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

我的问题是有没有一种方法可以访问已发送数据的实际长度并根据该调用接收数据,直到收到完整的消息?

【问题讨论】:

    标签: c# sockets iasyncresult


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 而不是前缀我只是实现了一个循环,如此处所述stackoverflow.com/questions/582550/…。它似乎正在工作! :)
      • 如果您想接收所有数据直到套接字关闭,您只能继续循环 - 否则您将不知道何时真正看到了所有数据.如果您只是在连接上执行单个请求/响应,那很好,但它不适用于每个方向有多个消息的“对话”类型的协议。
      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多