C++ C++;async\u接收和async\u发送处理程序中的Boost.Asio错误
当错误代码不是0时,连接是否正式“断开”C++ C++;async\u接收和async\u发送处理程序中的Boost.Asio错误,c++,boost-asio,C++,Boost Asio,当错误代码不是0时,连接是否正式“断开” 当错误代码不是0时,读取处理程序的bytesReceived参数是否可能不是0?如果可能的话,应该处理这些字节还是不处理 简而言之,非成功的错误\u code并不保证连接已断开,对于非组合操作,例如异步接收(),传输的字节数在成功时将0或更多,如果发生错误,总是0 未成功的错误\u code并不表示连接已正式断开。例如,在以下情况下,TCP连接仍然存在: 通过取消的未完成操作将导致调用处理程序时出现boost::asio::error::operat
简而言之,非成功的
错误\u code
并不保证连接已断开,对于非组合操作,例如异步接收()
,传输的字节数在成功时将0
或更多,如果发生错误,总是0
未成功的错误\u code
并不表示连接已正式断开。例如,在以下情况下,TCP连接仍然存在:
- 通过取消的未完成操作将导致调用处理程序时出现
boost::asio::error::operation\u中止
错误
- 只有全双工连接的一部分已连接。例如,如果套接字的接收端处于关闭状态,则仍然可以通过套接字通过连接发送数据
对于非合成操作,当发生错误时,传输的字节将0
。但是,0
并不表示发生了错误。例如,bytes\u transfered
可以是0
,error\u code
可以在使用或提供空缓冲区时指示成功。有关状态的async\u-receive()
和async\u-send()
文档:
如果操作成功完成,则调用[handler],并传输字节数。否则,将使用0
调用它
另一方面,组合操作,例如,可以使用非成功的错误\u代码
和非零的字节
调用。例如,如果启动了async\u read()
操作,并将其设置为在完成之前读取1024字节,则它可能会多次调用async\u read\u some()
。如果接收到256字节,然后连接关闭,async\u read()
处理程序将有一个非零的error\u code
,bytes\u transfer
将指示缓冲区的256字节有效
下面是一个完整的示例,说明即使某些操作失败,连接仍会保持:
#包括
#包括
#包括
void noop(){}
无效打印状态(
常量boost::system::error\u代码和错误,
std::大小(传输的字节数)
{
回答得很好!虽然你说不和不,但随后详细说明了不和是的情况(部分传输情况)@Dronz谢谢。我希望简短的回答是针对问题中提出的非组合操作,如果出现错误,字节_传输
将为0
。对于非组合操作,这并不总是正确的。答案会更新以强调差异,并提供对文档的更多了解阿泰。