サーバーにこのコードがあります
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();
}
});
}
そこで何が起こるの ?