サーバーのフラグ
同じサーバーを、シングルスレッド、複数スレッド、複数プロセス、AF_XDP(Linux の高速パケット処理用のソケット)のいずれでも動かせます。
wired_srvdriver_parse は、どれを使うかをコマンドラインから読み取ります。
このページでは --cores 0,1 で CPU 0 と 1 にワーカースレッドを一つずつ起動し、TLS ハンドシェイクを 3 回受けます。
コード
#define WIRED_MAIN#include "wired.h"
/* Unused here: the client below only does TLS handshakes, no requests. */static int on_request( void* ctx, const wired_h3reqdrive_req* req, u64 offset, wired_obuf* body_out, const char** content_type, int* more, u64* total_size) { (void)ctx; (void)req; (void)offset; (void)body_out; (void)content_type; (void)more; (void)total_size; return 0;}
int wired_main(int argc, char** argv) { /* The same fixed demo identity as the HTTP/3 hello page. */ static wired_srvboot_demo_keys keys; wired_srvboot_id id; wired_srvboot_demo(&id, &keys, 0x50, "guide-h3");
/* --port, --workers, --cores, --ifindex, ... pick and configure a driver. */ wired_srvdriver_opt opt = {0}; if (!wired_srvdriver_parse(argc, argv, &opt)) { wired_log_str("bad flags\n"); return 2; } wired_srvrun_handler h = {.cb = on_request}; wired_srvrun_obs obs = {0}; return wired_srvdriver_run(&id, h, obs, &opt) < 0 ? 1 : 0;}実行結果
$ ./quic-server-flags --port 4433 --cores 0,1conn closed by peer (CONNECTION_CLOSE)conn closed by peer (CONNECTION_CLOSE)conn closed by peer (CONNECTION_CLOSE)$ probe tls 127.0.0.1:4433 3handshake 1 ok: TLS 1.3handshake 2 ok: TLS 1.3handshake 3 ok: TLS 1.3wired_srvdriver_parse(argc, argv, &opt)は--port、--workers、--cores、--ifindex、--pin-coreなどのフラグをwired_srvdriver_optに読み込みます。 値が不正なときや、--workersと--coresのように両立しない組み合わせのときは 0 を返します。wired_srvdriver_run(&id, h, obs, &opt)はopt.kindが示すドライバーを起動します。 ドライバーは、単一プロセス、--workers Nで fork する複数プロセス、--cores 0,1で指定した CPU ごとに一つのスレッド、--ifindexによる AF_XDP のいずれかです。- 識別情報とハンドラーは、「はじめての HTTP/3」のページと同じものです。