我正在尝试使用 C++ 中的以下命令通过 TCP 套接字发送大约 50KByte 或更大的大量数据:
boost::asio::async_write(sock, boost::asio::buffer(sbuff, slen),
boost::bind((&send_handler), placeholders::error));
其中sbuff
是指向要传输的数据的指针,slen
是数据的长度。
有时操作成功,有时我得到一个错误,Operation cancelled
这里是接收方的代码部分,等待接收到特定数量的数据。
boost::asio::async_read(_sock,
boost::asio::buffer(rbuf, rlen),
boost::bind(&session::handle_read_payload,
this,
placeholders::bytes_transferred,
placeholders::error));
void session::handle_read_payload(buffer<uint8> &buff, size_t rbytes, const boost::system::error_code &e)
其中 rlen
是等待接收的字节数。 rbuf
是指向我存储接收到的字节的位置的指针。
我使用 Wireshark 检查了两台机器之间的 TCP 数据包流,我发现接收方突然发回一个带有 FIN 标志设置给发送方的数据包,从而终止了连接。
所以谁能告诉我问题的根源是什么?我的代码有问题吗?
如果我在 async_accept
之前调用 _acceptor.listen();
有什么关系吗?因为当我在没有 _acceptor.listen();
的情况下进行测试时,它工作得很好。那么会有什么不同呢?
最佳答案
从评论中的讨论到问题,听起来很像发送者和接收者之间对发送消息的大小存在分歧。
接收方接收到它认为是完整的消息然后关闭套接字,而发送方仍然认为接收方还没有接受更多数据。
为了诊断问题,我建议您在发出相应的读/写请求之前在发送方显示 slen,并在接收方显示 rlen(显示我的意思是写入日志或 std::cerr 或无论其他方法是否适用于您的应用程序。)如果这两个数字不相等,您知道在哪里寻找问题的根本原因。如果它们相等,则需要进行更多调查。
关于c++ - async_write 中的操作取消错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23793773/