我在服务器上有这段代码
void SocketTransportSession::DoRead() {
auto self(shared_from_this());
socket.async_read_some(ba::buffer(data),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
//TODO: process request
socket.async_write_some(boost::asio::buffer(res, maxLen),
[this, self](boost::system::error_code ec, std::size_t length) {
assert(!ec);
assert(length == maxLen);
//read some more
DoRead();
});
}
});
}
我想要的基本上是读取客户端请求(处理它,现在是一个假人)并回复它,然后重复循环,即从客户端/进程/...读取更多内容
在呈现的代码中,断言没有被触发(我们确认 !ec 和所有重播都已发送)但在我的客户端代码中我没有看到响应(即客户端在此时进行阻塞读取并且没有收到任何内容) .
编辑 刚刚发现像这样编写服务器具有预期的行为。原因似乎不是很明显
void SocketTransportSession::DoRead() {
auto self(shared_from_this());
socket.async_read_some(ba::buffer(data),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
DoWrite(length);
}
});
}
void SocketTransportSession::DoWrite(std::size_t length) {
auto self(shared_from_this());
ba::async_write(socket, ba::buffer(data),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
DoRead();
}
});
}
这里会发生什么?