C++ C++;异步网络编程

C++ C++;异步网络编程,c++,network-programming,boost-asio,aio,C++,Network Programming,Boost Asio,Aio,我有一些简单的问题,我有一个客户机-服务器应用程序和数据在网上发送 我希望能够恢复数据并正确处理 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()读

我有一些简单的问题,我有一个客户机-服务器应用程序和数据在网上发送

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

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()中读取所有内容,会发生什么

异步操作将 继续,直到出现下列情况之一: 条件是正确的:

  • 提供的缓冲区已满。也就是说,传输的字节等于缓冲区大小之和
  • 发生了一个错误
它会丢弃无法读取的数据吗?它会触发另一个异步读取吗? 而且,如果我的客户机按顺序向我发送ID+结构,我是否可以保证异步读取只会获得一个ID+结构?或者操作系统可以优化事情并将它们放在同一个paquet中? 正如您可能已经看到的,我有点困惑,我希望在设计服务器/客户端应用程序时做出正确的决定,任何帮助都将不胜感激


谢谢。

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

如果TCP缓冲区中没有足够的数据来填充输入缓冲区,则读取操作将只获取可用的数据,并报告获取的字节数。接下来会发生什么取决于你。提取的字节中可能有足够的数据来决定不想继续,因此asio不做任何假设。如果您没有读取足够的字节来组成一个完整的结构,那么请启动进一步的异步读取,重复该过程,直到您有足够的字节或某些内容死亡

我不确定你所说的“无法阅读所有内容”是什么意思。我想到了两种可能的含义:

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

  • 您描述的是异步读取的行为。在缓冲区已满或发生错误之前,异步\u读取不会完成。谢谢。因此,如果可读取的数据量没有填满一个结构,而我又进行了另一次异步读取,我将不得不使用一些静态缓冲区来跟踪不完整的结构。@sirAA:不,@Timo的更正(以及我的修订)是异步读取将等到整个结构可用后才能完成。