1

によって実装された非常に単純なsocketサーバーがありますboost::asio

tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
tcp::socket(io_service) sock;
a.accept(sock);
char data[1024];
boost::system::error_code error;
size_t length = sock->read_some(boost::asio::buffer(data), error);
std::cout << "Got: " << data << std::endl;

そして、そのクライアントは次のようになります。

size_t request_length = strlen(request);
boost::asio::write(s, boost::asio::buffer(request, request_length));

(どちらも公式の例から得たものです)

hello, world!ソケットに送るとGot: hello, world!すぐに届きました。ただし、そのバッファには1024バイトがあります。いつ読み終えるかをどうやって知ることができますか?

編集:

説明が悪いのでごめんなさい。私の質問は、read_some()いつ戻るべきかをどうやって知るかです。

4

1 に答える 1

7

read_some()受信バッファから少なくとも1バイトを読み取ると戻ります。受信バッファにデータがある場合、指定されたサイズまで可能な限り多くのデータを読み取ろうとします。1回の読み取り中にメッセージ全体を読み取る場合と読み取らない場合があります。

あなたの場合、あなたは偶然にメッセージ全体を受け取っているようです。read_some()1バイトしか読み取れなかった可能性があります。ループ内から呼び出しread_some()て、バッファーの開始インデックスを前回の読み取りの長さだけインクリメントすることをお勧めします。

何かのようなもの:

size_t length = 0;
while(length < MESSAGE_LENGTH)
{
    length += sock->read_some(boost::asio::buffer(&data[lenth], 1024 - length), error);
}

もちろん、これは説明のために簡略化されています。エラー状態などにも注意する必要があります。しかし、これはあなたが始めるのに十分なはずです。

于 2012-06-21T18:18:11.710 に答える