C++ C++;async\u接收和async\u发送处理程序中的Boost.Asio错误

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

当错误代码不是0时,连接是否正式“断开”

  • 当错误代码不是0时,读取处理程序的bytesReceived参数是否可能不是0?如果可能的话,应该处理这些字节还是不处理


  • 简而言之,非成功的
    错误\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
    。对于非组合操作,这并不总是正确的。答案会更新以强调差异,并提供对文档的更多了解阿泰。