我正在尝试通过编写一个将字符串发送到回显服务器的简单客户端来学习 boost::asio。我已经用 telnet 测试了 echo 服务器,效果很好,但是我的 boost::asio 客户端表现得很奇怪。在发送了四条消息(并由回显服务器返回)之前,async_read_until 似乎不会读取/调用处理程序。客户端的输出可能更好地解释了这一点(我在每个值之后删除了换行符):
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]
建立连接后,我有两个电话:
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 只打印 Writting/Read 及其正在写入/读取的值,然后再次使用完全相同的参数调用 async_write/async_read_until。writeToServer 将消息从我用“1\n”..“6\n”填充的队列中发送。
我认为错误不在回显服务器中,因为我可以看到它按顺序读取和写回所有 6 个值。正如我之前所说,使用 telnet 可以完美运行。那么,为什么 async_read_until 被 4 条消息“延迟”了?我试过发送更长的字符串,但结果是一样的。