我有一个简单的服务器 - 客户端应用程序。
idia是: 客户端使用sql-request发送到服务器字符串。 服务器处理请求并使用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;
如何在不知道其大小的情况下读取结果字符串? 或者,如果我的aproach(以字符串形式发送数据)是完全错误的,如何以正确的方式进行?
答案 0 :(得分:1)
您必须自己在客户端和服务器用来相互通信的协议中自行处理。
一种方法是使用分隔符并使用boost::asio::read_until()
。例如:
boost::asio::streambuf buf;
boost::asio::read_until (sock, buf, "\r\n"); // or '\0' if zero terminated
Check the Boost.Asio documentation
另一种方法是在发送可变长度部分之前在固定长度的标题中发送大小。
答案 1 :(得分:0)
您不会提前知道字符串的大小。在执行read_some的地方,您需要执行一个循环来读取套接字中的所有数据。您需要检查读取的字节数和分配的缓冲区大小。如果它们相等,那么你填满了读缓冲区,你需要再做一次读取来检查剩余的数据。