c++ - async_write 中的操作取消错误

标签 c++ sockets tcp boost-asio

我正在尝试使用 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/

相关文章:

c - Recv() 跳过字节

linux - 不需要 root 访问权限的优秀 Linux TCP/IP 监控工具?

scala - Akka 使用同一个端口创建两个 Tcp 连接

c++ - C++ 中的段错误在预分配缓冲区中创建的对象上调用虚方法

c++ - 从抽象类派生类 (C++)

c++ - Dependency Hell : linux . 所以插件动态加载

c++ - 如何为 c++11 更正以下生产者消费者代码

C++如何通过套接字发送结构?

c - 套接字编程客户端/服务器

tcp - MQTT 如何在防火墙后工作?