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。
我得到了简单的服务器-客户端应用程序。
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。