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

时间:2010-05-06 09:09:47

标签: c# .net sockets asynchronous

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

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

  
      
  1. 使用对BeginReceive()的调用将为我提供在调用回调函数时通过对另一端的BeginSend()的单次调用发送的全部数据。

  2.   
  3. 使用对BeginSend()的调用将把我传递给它的整个数据发送到另一端,并且通过一次调用另一端的BeginReceive()来接收所有数据。

    < / LI>   

事实上两者基本相同。

如果答案是否定的,我猜的是基于我读过的关于套接字的情况,处理命令的最佳方法是什么?我正在编写一个包含PUT X Y等命令的游戏。我想在每个命令的末尾添加一个特殊字符(例如#),每次收到数据时,我都会将它附加到缓冲区,然后在遇到{{1}后才解析它}。

1 个答案:

答案 0 :(得分:1)

不,您不能指望BeginReceive必须从一次BeginSend的来电中接收所有数据。您可以在一次调用中将{em> lot 数据发送到BeginSend,这很可能会分成几个数据包。您可以在单独的接收呼叫中接收每个数据包的数据。

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

  • 使用分隔符(根据您当前的建议)。这样做的好处是不需要事先知道大小,但缺点是难以解析,并可能引入诸如转义分隔符之类的要求。
  • 在邮件之前添加每封邮件的大小。接收器可以先读取长度,然后确切地知道预期的数据量。