Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;/ASIO/TCP/Socket/Response有时/经常为空,即使do_write已成功调用_C++_Asio - Fatal编程技术网

C++ C++;/ASIO/TCP/Socket/Response有时/经常为空,即使do_write已成功调用

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

我有一个关于asio和TCP套接字的问题

目前我正在使用
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%的时间到达客户机。这里最主要的问题是:没有一致的行为。