我在服务器上有这段代码
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();
}
});
}
这里发生了什么?