C++异步网络编程

标签 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() 读取完整结构? 我想设置一个处理程序来处理单个结构,但是如果我无法在单个 async_read() 中读取所有内容会发生什么情况?

The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

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

谢谢。

最佳答案

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

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

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

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

关于C++异步网络编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4272994/

相关文章:

c++ - cudaMemcpy 段错误

c++ - 异常处理

c++ - QtCreator:将字符串打印到终端的最佳方法是什么?

c++ - 根据报文序列号分发响应报文

c++ - 使用 boost::asio 获取广播源 ip 地址

c++ - boost::asio ssl 链接错误

c++ - 如何向创建对象的类发送消息

perl - Perl 中的基本网络聊天应用程序

Java - 最快的 TCP/HTTP 通信流?

networking - 关于计算机网络端口号的问题