C++ 异步写入中的操作已取消错误
我正在尝试使用C++中的以下命令通过TCP套接字发送大约50KB或更大容量的数据:C++ 异步写入中的操作已取消错误,c++,sockets,tcp,boost-asio,C++,Sockets,Tcp,Boost Asio,我正在尝试使用C++中的以下命令通过TCP套接字发送大约50KB或更大容量的数据: boost::asio::async_write(sock, boost::asio::buffer(sbuff, slen), boost::bind((&send_handler), placeholders::error)); 其中,sbuff是指向要传输的数据的指针,slen是数据的长度 有时操作成功,有时操作取消时出现错误 这里是接收器的代码部分,等待接收特定数量的数
boost::asio::async_write(sock, boost::asio::buffer(sbuff, slen),
boost::bind((&send_handler), placeholders::error));
其中,sbuff
是指向要传输的数据的指针,slen
是数据的长度
有时操作成功,有时操作取消时出现错误
这里是接收器的代码部分,等待接收特定数量的数据
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)
boost::asio::async\u read(\u sock,
boost::asio::buffer(rbuf、rlen),
boost::bind(&session::handle\u read\u有效负载,
这
占位符::已传输的字节数,
占位符::错误);
void session::handle\u read\u有效负载(缓冲区和缓冲区、大小\u t字节、常量boost::系统::错误代码和e)
其中,rlen
是等待接收的字节数。而rbuf
是一个指针,指向存储接收字节的位置
我使用Wireshark检查了两台机器之间的TCP数据包流,发现突然,接收方向发送方发送了一个设置了FIN标志的数据包,发送方终止了连接
有人能告诉我问题的根源是什么吗?我的代码有问题吗
如果我调用
\u acceptor.listen()有关系吗代码>在异步\u接受之前
。因为当我测试时没有\u acceptor.listen()代码>,它可以完美地工作。那么有什么不同呢?从评论中对问题的讨论来看,发送者和接收者对于发送的消息的大小似乎存在分歧
接收方接收到它认为是完整的消息,然后关闭套接字,而发送方仍然认为接收方没有接受更多的数据
为了诊断问题,我建议您在发出相应的读/写请求之前,在发送方显示slen,在接收方显示rlen(我所说的显示是指写入日志或std::cerr或任何其他适用于您的应用程序的方法)如果这两个数字不相等,您就知道从何处查找问题的根本原因。如果它们相等,则需要进行更多的调查。您是否也在接收端看到错误?如果是这样的话,是否可以判断哪一端首先检测到错误?接收器端没有错误。只有发送方,我假设rlen rlen比slen小,因为在开始时我读取消息的标题,然后读取其有效负载。在handle_read_payload中,我不再执行任何异步读取操作。我要做的是关闭套接字,然后当发件人想要向我发送消息时,他需要重新建立新的tcp连接。请编辑您的问题,以反映您上次评论中的信息。我的下一个问题是:当发送方看到错误时,接收方是否关闭了套接字?另外(另一个假设)我猜header length字段是一个2字节无符号整数。是否有可能slen偶尔大于2^16?您的分析是正确的。但是现在我在调用中发现了一些错误,比如boost::asio::async_write(sock,boost::asio::buffer(sbuff,slen),boost::bind(&send_handler),占位符::error))代码>slen的值为100412字节。但在网上,我只能找到65535个字节。你知道可能存在什么问题吗?这在另一个问题中得到了解决: