- 目的
- 単純なHTTPサーバ・クライアントの実装を通して、ネットワークの基礎を理解する
- 要件
- 言語:C
- システムコールを使用
- プロトコル:HTTP/1.1
- 機能
- クライアント側
- リクエストの送信
- 加算演算をリクエストする機能を実装
- 加算演算はint型で行うため32ビット符号付き整数の範囲内
- 具体的には[-2147483648, 2147483647]の範囲
- 負の数も括弧を使わずにクエリに含めることができる
- 例:
5 + -3は5+-3としてクエリに含める
- 例:
- 加算演算はint型で行うため32ビット符号付き整数の範囲内
- リクエスト例:
GET /calc?query=2+10 HTTP/1.1
- 加算演算をリクエストする機能を実装
- リクエストの送信
- サーバ側
- GETリクエストの処理
- 加算演算を実行するAPIエンドポイントを提供
- レスポンス例:
HTTP/1.1 200 OK\r\nContent-Length:2\r\n\r\n12
- GETリクエストの処理
- クライアント側
- 機能
- 言語:C
-
ファイル構成
-
server.c:HTTPサーバのロジック 0. ソケットの作成とバインド- socket(): 通信エンドポイントを作成・ファイルディスクリプタを返す
- domain: AF_INET(IPv4)
- protocol: SOCK_STREAM (信頼性の高い通信)
- bind(): ソケットにアドレスを割り当てる
- socket address familyがAF_INETの場合、struct sockaddr_inを使用
- クライアントからの接続受付
- listen(): accept()で接続を待機するための準備
- accept(): クライアントからの接続を受け入れ、新しいソケットを作成
- リクエストの受信と解析
- 指定された処理の実行
- レスポンスの生成と送信
- ソケットのクローズ
- socket(): 通信エンドポイントを作成・ファイルディスクリプタを返す
-
client.c:HTTPクライアントのロジック 0. ソケットの作成- サーバへの接続
- リクエストの生成と送信
- レスポンスの受信と表示
- ソケットのクローズ
-
Makefile:ビルド用Makefile
-
-
ビルド手順
- このディレクトリ直下で以下を実行
make
- このディレクトリ直下で以下を実行
-
実行手順
- ビルド後、以下を実行してサーバを起動
./server
- デフォルトでポート8080で待機
- ブラウザまたはcurlでアクセス可能
- 例:
curl "http://localhost:8080/calc?query=5+3"
- 例:
- 終了するには
Ctrl+Cを押す
- ブラウザまたはcurlでアクセス可能
- ビルド後、以下を実行してサーバを起動
- そもそもソケットとは?
- 任意のプロセス間通信行うための抽象化されたインタフェース
- プロセス間通信の一つとしてインターネット通信があるという構造
- 全体の流れ
- 上位のサーバソケットの作成
- ポートをバインドする
- デーモンを初期化する
- デーモンプロセスで待機する
- 接続を許可してクライアント用のソケットを作成する
- リクエストの処理をする
- クライアント用のソケットを閉じる
- 4に戻る