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

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

struct T1
{
   int id;
   int foo;
};

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

让我们采用这些结构,它们是在网络上发送的,该网络之前是一个INT,该INT将确定T1或T2是否遵循。如果客户端向我发送T1,然后向我发送T2,我是否可以保证我可以阅读ASIO :: ip :: TCP :: socket.asocke.aseync_read()的完整结构?我想设置一个将处理单个结构的处理程序,但是,如果我无法阅读单个async_read()中的所有内容,会发生什么?

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

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

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

谢谢你。

有帮助吗?

解决方案

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

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

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

  1. 可以读取的数据量不会填充结构。 在这种情况下,您只需执行另一个read_Async即可等待更多数据到达。
  2. 结构并未吸收所有到达的数据。 TCP堆栈将简单地缓冲未读取数据,直到您开始阅读它。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top