文字列をエコーサーバーに送信する単純なクライアントを作成して、boost::asio を学習しようとしています。telnet を使用してエコー サーバーをテストしたところ、問題なく動作しましたが、boost::asio クライアントの動作がおかしいです。async_read_until は、4 つのメッセージが送信される (およびエコー サーバーによって返される) まで、ハンドラーの読み取り/呼び出しを行わないようです。クライアントの出力は、これをよりよく説明している可能性があります (各値の後に改行を削除しました)。
gurka@x:~/private/code/test$ ./test localhost 2001
Hostname resolved.
Connected to server.
Starting write
Starting read_until
Writting[1]
Writting[2]
Writting[3]
Writting[4]
Read[1]
Writting[5]
Read[2]
Writting[6]
接続が確立されると、次の 2 つの呼び出しがあります。
boost::asio::async_write(mSocket, mOutgoingBuffer, boost::bind(&Connection::writeToServer, this, boost::asio::placeholders::error));
boost::asio::async_read_until(mSocket, mIncomingBuffer, "\n", boost::bind(&Connection::readFromServer, this, boost::asio::placeholders::error));
writeToServer と readFromServer は、書き込み/読み取りと書き込み/読み取りの値を出力し、まったく同じパラメーターで async_write/async_read_until 呼び出しを再度実行します。writeToServer は、「1\n」..「6\n」で満たされたキューからメッセージを送信します。
エコー サーバーが 6 つの値すべてを順番に読み書きしていることがわかるので、エラーはエコー サーバーにあるとは思いません。そして、前に言ったように、telnet を使って完璧に動作します。では、なぜ async_read_until が 4 メッセージ分「遅延」するのでしょうか? より長い文字列を送信しようとしましたが、同じです。