2010-11-25 79 views
0

我有一些简单的问题,我有一个客户端服务器应用程序和数据在电线上发送。C++异步网络编程

我希望能够恢复数据并正确处理它。

struct T1 
{ 
    int id; 
    int foo; 
}; 

struct T2 
{ 
    int id; 
    char foo; 
    int bar; 
}; 

让我们这些结构,它们是由一个int,这将告诉我们,如果T1或T2如下之前发送到网络上。 如果客户端向我发送T1,然后发送给我T2,我有保证可以使用asio :: ip :: tcp :: socket.async_read()读取完整的结构吗? 我想设置一个将处理单个结构的处理程序,但是如果我无法在单个async_read()中读取所有内容,会发生什么?

异步操作将 持续到以下 条件之一为真:

  • 所提供的缓冲器满了。也就是说,传输的字节数等于缓冲区大小的总和。
  • An error occurred。

它会丢弃无法读取的数据吗?它会触发另一个async_read? 而且,如果我的客户端顺序发送ID +结构,我确信async_read只会获得一个ID +结构吗?或者操作系统可以优化它们并将它们放在同一个paquet中?正如你可能看到的,我有点困惑,我想在设计服务器/客户端应用程序时作出正确的决定,任何帮助将不胜感激。

谢谢。

回答

1

编辑:感谢@timo指出一个错误。在读取整个结构之前,async_read不会完成,因此您不需要循环。否则,我的答案是一样的。不管TCP协议如何分解或合并数据,什么都不会丢失。

如果TCP缓冲区中没有足够的数据填充输入缓冲区,则读操作将简单地获取任何可用的数据,并报告获取的字节数。接下来发生的事情取决于你。你可能在抓取的字节中有足够的数据来决定你不想继续,所以asio不做任何假设。如果您没有读取足够的字节来构成完整的结构,请启动另一个async_read,重复该过程直到您有足够的字节或某些事件死亡。

我不确定你的意思是“无法读取所有内容”。想到两个可能的含义:

  1. 可用于读取的数据量不会填充结构。在这种情况下,您只需执行另一个read_async即可等待更多数据到达。
  2. 该结构不吸收所有到达的数据。 TCP堆栈将简单地缓存未读数据,直到您开始阅读它。
+1

你说的是async_read_some的行为。直到缓冲区已满或发生错误,async_read才会完成。 – Timo 2010-11-25 01:32:32