我正在尝试使用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();
的情况下进行测试时,它完美无缺。那会有什么不同呢?
答案 0 :(得分:1)
从评论中的讨论到问题,听起来非常像发送者和接收者之间关于发送消息大小的不一致。
接收方收到它认为完整的消息,然后关闭套接字,而发送方仍然认为接收方尚未接受更多数据。
要诊断问题,我建议您在发送方显示sln,并在发出相应的读/写请求之前在接收方显示rlen(通过显示我的意思是写入日志或std :: cerr或无论其他方法适用于您的应用程序。)如果这两个数字不相等,您就知道在哪里寻找问题的根本原因。如果他们是平等的 - 那么就需要进行更多的调查。