操作在async_write中取消了错误

时间:2014-05-21 21:04:58

标签: 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标志设置给发送者的数据包,终止连接。

所以有人能告诉我问题的根源是什么吗?我的代码有什么问题吗?

如果我在_acceptor.listen();之前致电async_accept,这是否重要?因为当我在没有_acceptor.listen();的情况下进行测试时,它完美无缺。那会有什么不同呢?

1 个答案:

答案 0 :(得分:1)

从评论中的讨论到问题,听起来非常像发送者和接收者之间关于发送消息大小的不一致。

接收方收到它认为完整的消息,然后关闭套接字,而发送方仍然认为接收方尚未接受更多数据。

要诊断问题,我建议您在发送方显示sln,并在发出相应的读/写请求之前在接收方显示rlen(通过显示我的意思是写入日志或std :: cerr或无论其他方法适用于您的应用程序。)如果这两个数字不相等,您就知道在哪里寻找问题的根本原因。如果他们是平等的 - 那么就需要进行更多的调查。