C++ asio 套接字从服务器读取答案

c++ asio socket read answer from server

我得到了简单的服务器-客户端应用程序。

idia 是: 客户端使用 sql-请求发送到服务器字符串。 服务器处理请求并使用 csv 样式字符串格式的数据发送回客户端应答。

万事俱备,接受一件事。问题是阅读客户端的答案,因为我不知道收到的字符串的大小。

代码如下:

服务器:

std::string answer;
answer = sql_read(*msg); //get the string with data from request
clientSock->write_some(buffer(answer, answer.size())); //send it back on client

客户:

std::string answer;
bytesRead = sock->read_some(boost::asio::buffer(readBuf, inputSize)); //read the answer, but how do I know correct size of string?
string_ptr msg(new std::string(readBuf, bytesRead));
answer = *msg;

如何在不知道其大小的情况下读取结果字符串? 或者,如果我的方法(以字符串形式发送数据)完全错误,如何以正确的方式进行?

你不会事先知道字符串的大小。在执行 read_some 的地方,您需要执行一个循环以从套接字读取所有数据。您需要检查读取的字节数和分配的缓冲区大小。如果它们相等,那么您已填满读取缓冲区,您需要进行另一次读取以检查是否有任何剩余数据。

您必须在客户端和服务器用来相互通信的协议中自行处理此问题。

一种方法是使用分隔符并使用 boost::asio::read_until()。示例:

boost::asio::streambuf buf;
boost::asio::read_until (sock, buf, "\r\n");  // or '[=10=]' if zero terminated

Check the Boost.Asio documentation.

另一种方法是在发送可变长度部分之前发送固定长度的大小header。