gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:51:58 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com