Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异步写入中的操作已取消错误_C++_Sockets_Tcp_Boost Asio - Fatal编程技术网

C++ 异步写入中的操作已取消错误

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是数据的长度 有时操作成功,有时操作取消时出现错误 这里是接收器的代码部分,等待接收特定数量的数

我正在尝试使用C++中的以下命令通过TCP套接字发送大约50KB或更大容量的数据:

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个字节。你知道可能存在什么问题吗?这在另一个问题中得到了解决: