2016-10-10 17 views
1

我有簡單的服務器客戶端應用程序。C++ asio socket從服務器讀取答案

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

提示:'clientSock-> write_some()'可能不會寫入所有數據。您必須檢查返回值並在循環中調用它。阿西奧有一個輔助功能來避免這種不便。例如:'boost :: asio :: write(sock,boost :: asio :: buffer(answer));'。 –

回答

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

另一種方法是在發送可變長度部分之前發送固定長度頭部中的大小。

0

您不會預先知道字符串的大小。在你做read_some的地方,你需要做一個循環來讀取套接字中的所有數據。您需要檢查讀取的字節數和您分配的緩衝區的大小。如果它們相等,那麼你填充了你的讀緩衝區,你需要做另一次讀取來檢查剩餘的數據。