C++ C++;/ASIO/TCP/Socket/Response有时/经常为空,即使do_write已成功调用
我有一个关于asio和TCP套接字的问题 目前我正在使用C++ C++;/ASIO/TCP/Socket/Response有时/经常为空,即使do_write已成功调用,c++,asio,C++,Asio,我有一个关于asio和TCP套接字的问题 目前我正在使用async\u read\u,直到出现两个“\n\n”的序列。如果没有错误,我将执行一些数据库操作并向客户机返回响应。这基本上是使用asio示例完成的。我的问题是:如果我遇到一个错误(asio::error\u code&ec!=null),那么我如何确保我可以将答案写回客户机?因为如果我从错误条件中调用do_write(…),大约有一半的响应无法到达客户端 void do_read (some data) { asio::async_re
async\u read\u,直到出现两个“\n\n”的序列。如果没有错误,我将执行一些数据库操作并向客户机返回响应。这基本上是使用asio示例完成的。我的问题是:如果我遇到一个错误(asio::error\u code&ec!=null
),那么我如何确保我可以将答案写回客户机?因为如果我从错误条件中调用do_write(…),大约有一半的响应无法到达客户端
void do_read (some data) {
asio::async_read_until(socket_, buf_, "\n\n",
[this, self](const asio::error_code& ec, std::size_t bytes_transferred)
{
if(ec) {
do_write("This answer does not reach the client 50% of the time, sometimes more; sometimes less");
} else {
do_write("You did well my young apprentice! Always works");
}
});
}
void do_write(const std::string& response) {
asio::async_write(socket_, asio::buffer(response.c_str(), response.length()),
[this, self, response](std::error_code ec, std::size_t bytes_transferred) {
if (ec) {
// no error here whats-o-ever!
} else {
// OK: bytes_transferred == response.size()
}
}
}
我肯定做错了什么,但是什么?起初我认为这都是异步的,所以可能参数超出了范围。但是不管ec==null,都会调用do_write
,我甚至使用逐字字符串对其进行测试,如本例所示
- Archlinux
- ASIO 1.18.1
- netcat作为客户端
- GCC 10.2.0
- 不使用boost
错误代码是什么?如果读取失败,很可能是连接断开,这意味着您无法向客户端发送任何内容。如果我选择一个小缓冲区,并且在字节流中找不到该模式,则该模式将以“Element not found”失败。这很好。但是,如果我将答案发送回客户机,仍然没有错误,但是该答案没有在50%的时间到达客户机。这里最主要的问题是:没有一致的行为。