一次sougo workflow库的使用过程

安装就是常规的make install

tutorial http_echoserver实现一下,在macos上实现


cmakelist.txt

cmake_minimum_required(VERSION 3.6)

set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Release")

project(main
		LANGUAGES C CXX
)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) #放在本项目下bin文件夹下
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_COMPILER g++) 

# cmake 找包
find_package(workflow REQUIRED CONFIG HINTS ..)
# 来自
include_directories(${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR})
# 找到workflow就有这些变量,不用管
link_directories(${WORKFLOW_LIB_DIR})

# 源码目录
AUX_SOURCE_DIRECTORY(. SRC)

#  目前只针对macos端
if (APPLE)
	set(WORKFLOW_LIB workflow pthread )
endif ()

add_executable(main ${SRC})
target_link_libraries(main ${WORKFLOW_LIB})

main.cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "workflow/HttpMessage.h"
#include "workflow/HttpUtil.h"
#include "workflow/WFServer.h"
#include "workflow/WFHttpServer.h"
#include "workflow/WFFacilities.h"

void process(WFHttpTask *server_task)
{
	protocol::HttpRequest *req = server_task->get_req();
	protocol::HttpResponse *resp = server_task->get_resp();
	long long seq = server_task->get_task_seq();
	protocol::HttpHeaderCursor cursor(req);
	std::string name;
	std::string value;
	char buf[8192];
	int len;

	/* Set response message body. */
	resp->append_output_body_nocopy("", 6);
	len = snprintf(buf, 8192, "

%s %s %s

"
, req->get_method(), req->get_request_uri(), req->get_http_version()); resp->append_output_body(buf, len); while (cursor.next(name, value)) { len = snprintf(buf, 8192, "

%s: %s

"
, name.c_str(), value.c_str()); resp->append_output_body(buf, len); } resp->append_output_body_nocopy("", 7); /* Set status line if you like. */ resp->set_http_version("HTTP/1.1"); resp->set_status_code("200"); resp->set_reason_phrase("OK"); resp->add_header_pair("Content-Type", "text/html"); resp->add_header_pair("Server", "Sogou WFHttpServer"); if (seq == 9) /* no more than 10 requests on the same connection. */ resp->add_header_pair("Connection", "close"); /* print some log */ char addrstr[128]; struct sockaddr_storage addr; socklen_t l = sizeof addr; unsigned short port = 0; server_task->get_peer_addr((struct sockaddr *)&addr, &l); if (addr.ss_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in *)&addr; inet_ntop(AF_INET, &sin->sin_addr, addrstr, 128); port = ntohs(sin->sin_port); } else if (addr.ss_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr; inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr, 128); port = ntohs(sin6->sin6_port); } else strcpy(addrstr, "Unknown"); fprintf(stderr, "Peer address: %s:%d, seq: %lld.\n", addrstr, port, seq); } static WFFacilities::WaitGroup wait_group(1); void sig_handler(int signo) { wait_group.done(); } int main(int argc, char *argv[]) { unsigned short port; if (argc != 2) { fprintf(stderr, "USAGE: %s \n", argv[0]); exit(1); } signal(SIGINT, sig_handler); WFHttpServer server(process); port = atoi(argv[1]); if (server.start(port) == 0) { wait_group.wait(); server.stop(); } else { perror("Cannot start server"); exit(1); } return 0; }

run.sh

cmake -B b
cmake --build b 
./bin/main 9999 &
curl localhost:9999
killall main
rm -rf b

文件目录结构

MacBook :: Programming/myf » ls 
CMakeLists.txt b              bin            main.cpp       run.sh

你可能感兴趣的:(学习)