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()中读取所有内容,会发生什么
异步操作将
继续,直到出现下列情况之一:
条件是正确的:
- 提供的缓冲区已满。也就是说,传输的字节等于缓冲区大小之和
- 发生了一个错误
谢谢。编辑:感谢@timo指出错误。在读取整个结构之前,异步读取不会完成,因此不需要循环。否则,我的答案是一样的。无论TCP协议如何分解或合并数据,都不会丢失任何内容 如果TCP缓冲区中没有足够的数据来填充输入缓冲区,则读取操作将只获取可用的数据,并报告获取的字节数。接下来会发生什么取决于你。提取的字节中可能有足够的数据来决定不想继续,因此asio不做任何假设。如果您没有读取足够的字节来组成一个完整的结构,那么请启动进一步的异步读取,重复该过程,直到您有足够的字节或某些内容死亡 我不确定你所说的“无法阅读所有内容”是什么意思。我想到了两种可能的含义:
您描述的是异步读取的行为。在缓冲区已满或发生错误之前,异步\u读取不会完成。谢谢。因此,如果可读取的数据量没有填满一个结构,而我又进行了另一次异步读取,我将不得不使用一些静态缓冲区来跟踪不完整的结构。@sirAA:不,@Timo的更正(以及我的修订)是异步读取将等到整个结构可用后才能完成。