我正在实现一个带有 boost asio 库的 tcp 服务器。在服务器中,我使用 asio::async_read_some 获取数据,并使用 asio::write 写入数据。服务器代码是这样的。
std::array<char, kBufferSize> buffer_;
std::string ProcessMessage(const std::string& s) {
if (s == "msg1") return "resp1";
if (s == "msg2") return "resp2";
return "";
}
void HandleRead(const boost::system::error_code& ec, size_t size) {
std::string message(buffer_.data(), size);
std::string resp = ProcessMessage(message);
if (!resp.empty()) {
asio::write(socket, boost::asio::buffer(message), WriteCallback);
}
socket.async_read_some(boost::asio::buffer(buffer_));
}
然后我写了一个客户端来测试服务器,代码是这样的
void MessageCallback(const boost::system::error_code& ec, size_t size) {
std::cout << string(buffer_.data(), size) << std::endl;
}
//Init socket
asio::write(socket, boost::asio::buffer("msg1"));
socket.read_some(boost::asio::buffer(buffer_), MessageCallback);
// Or async_read
//socket.async_read_some(boost::asio::buffer(buffer_), MessageCallback);
asio::write(socket, boost::asio::buffer("msg1"));
socket.read_some(boost::asio::buffer(buffer_), MessageCallback);
// Or async_read
//socket.async_read_some(boost::asio::buffer(buffer_), MessageCallback);
如果我运行客户端,代码将在第二个 read_some 等待,输出为:resp1
.
如果我删除第一个 read_some,输出是resp1resp2
,这意味着服务器做了正确的事情。
似乎第一个 read_some 吃掉了第二个响应,但没有对 MessageCallback 函数做出响应。
我已阅读什么是消息边界?,我认为如果这个问题是“消息边界”问题,第二个 read_some 应该打印一些东西,因为第一个 read_some 只从 tcp 套接字获取部分流。
我怎么解决这个问题?
更新:我尝试将客户端缓冲区的大小更改为 4,输出将是:
resp
resp
似乎 read_some 函数会比从套接字读取更多,我将阅读 boost 代码以找出是否属实。