代码之家  ›  专栏  ›  技术社区  ›  IVlad

BeginReceive()是否获取BeginSend()发送的所有内容?

  •  0
  • IVlad  · 技术社区  · 16 年前

    我正在编写一个同时具有服务器端和客户机端的程序,客户机端将连接到由同一程序托管的服务器(但由它的另一个实例托管,通常在另一台机器上)。所以基本上,我可以控制协议的两个方面。

    我正在使用 BeginReceive() BeginSend() 在双方发送和接收数据。我的问题是,这两个说法是否属实:

    1. 使用对BeginReceive()的调用将给出调用回调函数时,通过对另一端BeginSend()的单个调用发送给我的整个数据。

    2. 使用对beginsend()的调用会将我传递给它的整个数据发送到另一端,并且它将被另一端对beginreceive()的单个调用接收。

    事实上,两者基本相同。

    如果答案是否定的,我猜是基于我所读到的关于套接字的内容,那么处理命令的最佳方法是什么?我正在编写一个具有如下命令的游戏 PUT X Y . 我在想附加一个特殊的角色( # 例如)在每个命令的末尾,每次接收数据时,我都将其附加到缓冲区,然后仅在遇到 γ .

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jon Skeet    16 年前

    不,你不能指望 BeginReceive 必须从一个调用接收所有数据 BeginSend . 你可以发送一个 许多 一次调用中的数据 贝金森德 可以很好地分割成几个包。您可以在单独的接收呼叫中接收每个数据包的数据。

    将流拆分为多个块的两种主要方法是:

    • 使用分隔符(根据您当前的建议)。这样做的好处是不需要事先知道大小,但缺点是相对难以解析,并且可能引入诸如转义分隔符之类的要求。
    • 在消息之前预先设置每个消息的大小。接收器可以先读取长度,然后准确知道需要多少数据。