29#include <console-util.h>
38 printf(
"[PID %lu] クライアント処理開始\n", (
unsigned long)
get_pid());
40 while ((n = (
int)
client_recv(fd, buffer,
sizeof(buffer) - 1)) > 0) {
42 printf(
"[PID %lu] 受信: %s", (
unsigned long)
get_pid(), buffer);
46 printf(
"[PID %lu] クライアント切断\n", (
unsigned long)
get_pid());
68 int *conns_per_worker) {
69 for (
int i = 1; i < argc; i++) {
70 if (strcmp(argv[i],
"--mode") == 0 && i + 1 < argc) {
72 if (strcmp(argv[i],
"fork") == 0) {
74 }
else if (strcmp(argv[i],
"prefork") == 0) {
77 }
else if (strcmp(argv[i],
"--port") == 0 && i + 1 < argc) {
78 *port = atoi(argv[++i]);
79 }
else if (strcmp(argv[i],
"--workers") == 0 && i + 1 < argc) {
80 *workers = atoi(argv[++i]);
81 }
else if (strcmp(argv[i],
"--conns-per-worker") == 0 && i + 1 < argc) {
82 *conns_per_worker = atoi(argv[++i]);
101int main(
int argc,
char *argv[]) {
116 parse_args(argc, argv, &mode, &port, &workers, &conns_per_worker);
int main(int argc, char *argv[])
メインエントリーポイント。
static void parse_args(int argc, char *argv[], ServerMode *mode, int *port, int *workers, int *conns_per_worker)
コマンドライン引数を解析します。
void handle_client_session(ClientFd fd)
TCP 通信メインループ (デフォルト実装)。
void platform_init(ClientSessionFn session_fn)
プラットフォーム初期化 (Windows: WSAStartup / Linux: no-op)。
@ MODE_FORK
接続ごと fork モード。
@ MODE_PREFORK
プリフォークモード (デフォルト)。
int dispatch_internal_args(int argc, char *argv[])
内部起動引数を処理します。
#define DEFAULT_PORT
デフォルト待ち受けポート番号。
#define DEFAULT_CONNS_PER_WORKER
デフォルト 1 ワーカーあたりの同時接続数。
void platform_cleanup(void)
プラットフォーム後処理 (Windows: WSACleanup / Linux: no-op)。
#define DEFAULT_WORKERS
デフォルト prefork ワーカー数。
void run_prefork_server(int port, int num_workers, int conns_per_worker)
prefork モードのサーバーを起動します。
#define BUFFER_SIZE
送受信バッファサイズ (バイト)。
#define client_close(fd)
クライアントソケットを閉じる。
void run_fork_server(int port)
fork モードのサーバーを起動します。
#define client_recv(fd, buf, len)
クライアントからデータを受信する。
#define get_pid()
現在のプロセス ID を取得する。
int ClientFd
クライアントソケットの型。Linux では int、Windows では SOCKET。
#define client_send(fd, buf, len)
クライアントへデータを送信する。