2016-10-10 6 views
1

私は単純なサーバークライアントアプリケーションを持っています。C++ asio socket read答えサーバー

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()'はすべてのデータを書き込んでいない可能性があります。戻り値をチェックしてループで呼び出す必要があります。 Asioにはこの不都合を回避するヘルパー機能があります。例:boost :: asio :: write(sock、boost :: asio :: buffer(answer)); '。 –

答えて

1

クライアントとサーバーが互いに話すために使用するプロトコルでこれを処理する必要があります。

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を行う場合は、ソケットからすべてのデータを読み込むためにループを実行する必要があります。読み込んだバイト数と割り当てたバッファのサイズを確認する必要があります。それらが等しければ、あなたはあなたの読み込みバッファをいっぱいにして、残りのデータをチェックするために別の読み込みをする必要があります。

関連する問題