1

我知道如何使用nghttp2asio 库来构建 HTTP2 服务器和客户端应用程序。

文档说有API可以stop优雅join地停止 HTTP2 服务器。

有没有使用stopand的工作示例join?特别是,一旦listen_and_serve被调用,线程就进入忙碌循环。是否建议stop从不同的线程调用?不幸的是,文档中没有给出任何线索或示例代码。

编辑:

这是一个工作程序,我试图在其中停止服务器SIGINT

#include <iostream>
#include <thread>
#include <nghttp2/asio_http2_server.h>

using namespace nghttp2::asio_http2;
using namespace nghttp2::asio_http2::server;

nghttp2::asio_http2::server::http2 myserver;
void signalHandler( int signum ) {
  std::cout << "Interrupt signal (" << signum << ") received." << std::endl;
  myserver.stop();
  myserver.join();
  exit(0);
}

int main(int argc, char *argv[]) {
  signal(SIGINT, signalHandler);
  std::thread::id this_id = std::this_thread::get_id();
  std::cout << "Main thread running at " << this_id << std::endl;
  boost::system::error_code ec;

  myserver.handle("/api/ping", [](const request &req, const response &res) {
    std::thread::id this_id = std::this_thread::get_id();
    std::cout << "Ping Request received at " << this_id << std::endl;
    req.on_data([](const uint8_t *data, std::size_t len){
      std::cerr.write(reinterpret_cast<const char *>(data), len);
      std::cerr << std::endl;
    });
    res.write_head(200);
    res.end("hello, ping\n");
  });

  if (myserver.listen_and_serve(ec, "0.0.0.0", "8080")) {
    std::cerr << "error: " << ec.message() << std::endl;
  }
}

myserver.stop()按 后执行挂起Control+C。我尝试仅使用myserver.stop()myserver.join()但没有任何改进。如果我exit(0)像下面这样直接调用,服务器会因分段错误而停止。

void signalHandler( int signum ) {
  std::cout << "Interrupt signal (" << signum << ") received." << std::endl;
  myserver.stop();
  myserver.join();
  exit(0);
}

任何帮助表示赞赏。

4

1 回答 1

1

asynchronous参数 inlisten_and_serve应设置为,true默认为asynchronous = false

请注意,服务器不会退出并等待,myserver.join()直到最后一个客户端连接关闭。当您调用myserver.close()时,服务器将停止接受新连接。

下面的工作解决方案:

#include <iostream>
#include <thread>
#include <nghttp2/asio_http2_server.h>

using namespace nghttp2::asio_http2;
using namespace nghttp2::asio_http2::server;

nghttp2::asio_http2::server::http2 myserver;
void signalHandler( int signum ) {
  std::cout << "Interrupt signal (" << signum << ") received." << std::endl;
  myserver.stop();
}

int main(int argc, char *argv[]) {
  signal(SIGINT, signalHandler);
  std::thread::id this_id = std::this_thread::get_id();
  boost::system::error_code ec;

  myserver.handle("/api/ping", [](const request &req, const response &res) {
    std::thread::id this_id = std::this_thread::get_id();
    std::cout << "Ping Request received at " << this_id << std::endl;
    req.on_data([](const uint8_t *data, std::size_t len){
      std::cerr.write(reinterpret_cast<const char *>(data), len);
      std::cerr << std::endl;
    });
    res.write_head(200);
    res.end("hello, ping\n");
  });

  if (myserver.listen_and_serve(ec, "0.0.0.0", "8080", true)) {
    std::cerr << "error: " << ec.message() << std::endl;
  }
  myserver.join();
}
于 2018-11-09T15:09:53.683 回答