Document of c-modernization-kit (porter) 1.0.0

Loading...
Searching...
No Matches
tcpServer.c
Go to the documentation of this file.
1
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <console-util.h>
30
31#include "tcpServer.h"
32
33/* doxygen コメントは、ヘッダに記載 */
34 void handle_client_session(ClientFd fd) {
35 char buffer[BUFFER_SIZE];
36 int n;
37
38 printf("[PID %lu] クライアント処理開始\n", (unsigned long)get_pid());
39
40 while ((n = (int)client_recv(fd, buffer, sizeof(buffer) - 1)) > 0) {
41 buffer[n] = '\0';
42 printf("[PID %lu] 受信: %s", (unsigned long)get_pid(), buffer);
43 client_send(fd, buffer, (size_t)n);
44 }
45
46 printf("[PID %lu] クライアント切断\n", (unsigned long)get_pid());
47 client_close(fd);
48}
49
66 static void parse_args(int argc, char *argv[],
67 ServerMode *mode, int *port, int *workers,
68 int *conns_per_worker) {
69 for (int i = 1; i < argc; i++) {
70 if (strcmp(argv[i], "--mode") == 0 && i + 1 < argc) {
71 i++;
72 if (strcmp(argv[i], "fork") == 0) {
73 *mode = MODE_FORK;
74 } else if (strcmp(argv[i], "prefork") == 0) {
75 *mode = MODE_PREFORK;
76 }
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]);
83 }
84 }
85}
86
101 int main(int argc, char *argv[]) {
102 console_init();
103 platform_init(handle_client_session);
104
105 if (dispatch_internal_args(argc, argv)) {
106 platform_cleanup();
107 console_dispose();
108 return 0;
109 }
110
111 ServerMode mode = MODE_PREFORK;
112 int port = DEFAULT_PORT;
113 int workers = DEFAULT_WORKERS;
114 int conns_per_worker = DEFAULT_CONNS_PER_WORKER;
115
116 parse_args(argc, argv, &mode, &port, &workers, &conns_per_worker);
117
118 if (mode == MODE_FORK) {
119 run_fork_server(port);
120 } else {
121 run_prefork_server(port, workers, conns_per_worker);
122 }
123
124 platform_cleanup();
125 console_dispose();
126 return 0;
127}
main
int main(int argc, char *argv[])
メインエントリーポイント。
Definition tcpServer.c:101
parse_args
static void parse_args(int argc, char *argv[], ServerMode *mode, int *port, int *workers, int *conns_per_worker)
コマンドライン引数を解析します。
Definition tcpServer.c:66
handle_client_session
void handle_client_session(ClientFd fd)
TCP 通信メインループ (デフォルト実装)。
Definition tcpServer.c:34
tcpServer.h
TCP サーバーサンプル共通定義。
platform_init
void platform_init(ClientSessionFn session_fn)
プラットフォーム初期化 (Windows: WSAStartup / Linux: no-op)。
Definition tcpServer_linux.c:254
ServerMode
ServerMode
サーバー動作モード。
Definition tcpServer.h:87
MODE_FORK
@ MODE_FORK
接続ごと fork モード。
Definition tcpServer.h:89
MODE_PREFORK
@ MODE_PREFORK
プリフォークモード (デフォルト)。
Definition tcpServer.h:88
dispatch_internal_args
int dispatch_internal_args(int argc, char *argv[])
内部起動引数を処理します。
Definition tcpServer_linux.c:264
DEFAULT_PORT
#define DEFAULT_PORT
デフォルト待ち受けポート番号。
Definition tcpServer.h:70
DEFAULT_CONNS_PER_WORKER
#define DEFAULT_CONNS_PER_WORKER
デフォルト 1 ワーカーあたりの同時接続数。
Definition tcpServer.h:74
platform_cleanup
void platform_cleanup(void)
プラットフォーム後処理 (Windows: WSACleanup / Linux: no-op)。
Definition tcpServer_linux.c:259
DEFAULT_WORKERS
#define DEFAULT_WORKERS
デフォルト prefork ワーカー数。
Definition tcpServer.h:72
run_prefork_server
void run_prefork_server(int port, int num_workers, int conns_per_worker)
prefork モードのサーバーを起動します。
Definition tcpServer_linux.c:316
BUFFER_SIZE
#define BUFFER_SIZE
送受信バッファサイズ (バイト)。
Definition tcpServer.h:76
client_close
#define client_close(fd)
クライアントソケットを閉じる。
Definition tcpServer.h:40
run_fork_server
void run_fork_server(int port)
fork モードのサーバーを起動します。
Definition tcpServer_linux.c:275
client_recv
#define client_recv(fd, buf, len)
クライアントからデータを受信する。
Definition tcpServer.h:36
get_pid
#define get_pid()
現在のプロセス ID を取得する。
Definition tcpServer.h:34
ClientFd
int ClientFd
クライアントソケットの型。Linux では int、Windows では SOCKET。
Definition tcpServer.h:29
client_send
#define client_send(fd, buf, len)
クライアントへデータを送信する。
Definition tcpServer.h:38