【发布时间】:2019-04-11 14:13:45
【问题描述】:
我有这个要求,我的应用必须通过套接字连接到另一个应用,并且必须长时间保持持久连接。我的应用程序将是一个 TCP 客户端,另一个是 TCP 服务器。我的应用程序将发送命令,服务器将做出相应的响应。
现在面临的问题是如何从服务器读取整个数据字符串并返回应用程序,该应用程序将发出下一个命令。同步读取(使用asio::read)看起来是一个不错的选择,直到我观察到套接字挂起直到我终止服务器为止。查看文档,我发现该库工作正常。
他的函数用于从流中读取一定字节数的数据。调用将阻塞,直到以下条件之一为真: 1. 提供的缓冲区已满。也就是说,传输的字节数等于缓冲区大小的总和。 2. 发生错误。
问题是我不知道正确的缓冲区大小,因为来自服务器的响应会有所不同。因此,如果我放置的缓冲区太小,它会返回正常但会丢失一些数据。如果我放得太大,它将永远挂起,直到服务器退出。
所以我想我会做异步阅读。它只工作一次,我不知道如何让它获取数据,直到它读取整个数据。
这里是相关的异步代码
#define ASIO_STANDALONE 1
#include <iostream>
#include <asio.hpp>
int main()
{
asio::io_context context;
size_t reply_length;
size_t length = 1024;
std::vector<char> buffer;
//create socket
asio::ip::tcp::socket socket(context);
socket.connect(asio::ip::tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 8088));
std::string dataOut = "list --files"; //some command to write
std::error_code error;
asio::write(socket, asio::buffer(dataOut), error);
if (!error)
{
std::cout << "Receiving...!" << std::endl;
buffer.resize(length);
asio::async_read(socket, asio::buffer(buffer), [&buffer, &context](const asio::error_code &ec, std::size_t bytes_transferred) {
std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<char>(std::cout, ""));
std::cout << "\nRead total of:" << bytes_transferred << "\n";
context.run();
});
}
else
{
std::cout << "send failed: " << error.message() << std::endl;
}
context.run();
}
搜索对解决我的问题没有多大帮助。
所以我的问题是,如何使用 asio 读取持久套接字中的所有数据?我没有使用 boost。
【问题讨论】:
标签: c++ boost-asio