这是我基于libevent的小型http服务器;
#include "fmt/format.h"
#include <cstdint>
#include <cstdio>
#include <event2/event-config.h>
#include <event2/util.h>
#include <evhttp.h>
#include <memory>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <syslog.h>
#include <type_traits>
#include <unistd.h>
auto
main() -> int
{
constexpr char host[] = "127.0.0.1";
constexpr std::uint16_t port = 5555;
using event_base_new_type
= std::pointer_traits<decltype(event_base_new())>::element_type;
using event_base_deleter_type = decltype(&event_base_free);
auto event_base
= std::unique_ptr<event_base_new_type, event_base_deleter_type>(
event_base_new(), &event_base_free);
if(!(event_base))
{
fmt::print(stderr, "Failed to init libevent.\n");
return -1;
}
using evhttp_new_type = std::pointer_traits<decltype(
evhttp_new(event_base.get()))>::element_type;
using evhttp_deleter_type = decltype(&evhttp_free);
auto http = std::unique_ptr<evhttp_new_type, evhttp_deleter_type>(
evhttp_new(event_base.get()), &evhttp_free);
auto handle = evhttp_bind_socket_with_handle(http.get(), host, port);
if(!handle)
{
fmt::print(stderr, "Failed to init http server.\n");
return -1;
}
auto callback = [](evhttp_request* req, void*) {
auto* OutBuf = evhttp_request_get_output_buffer(req);
if(!OutBuf)
return;
evbuffer_add_printf(OutBuf,
"<html><body><center><h1>Hello World!</h1></center></body></html>");
evhttp_send_reply(req, HTTP_OK, "", OutBuf);
};
evhttp_set_gencb(http.get(), callback, nullptr);
if(event_base_dispatch(event_base.get()) == -1)
{
fmt::print(stderr, "Failed to run messahe loop.\n");
return -1;
}
return 0;
}
g++ a.cpp -lfmt -levent
./a.out
我正在尝试将该程序作为守护程序运行,因此我可以将其整数化为ctest测试用例。
我已经尝试过this article,这是我的代码:
http://127.0.0.1:5555
但是无法显示“ hello world”。如何解决或有更好的解决方案?