0

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

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

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

异步操作将继续进行,直到满足以下条件之一:

  • 提供的缓冲区已满。也就是说,传输的字节数等于缓冲区大小的总和。
  • 发生错误。

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

谢谢你。

4

1 回答 1

1

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

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

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

  1. 可读取的数据量不会填充结构。在这种情况下,您只需执行另一个 read_async 以等待更多数据到达。
  2. 该结构不会吸收所有到达的数据。TCP 堆栈将简单地缓冲未读数据,直到您开始阅读它。
于 2010-11-25T01:29:06.067 回答