Skip to content

Latest commit

 

History

History
80 lines (73 loc) · 3.16 KB

File metadata and controls

80 lines (73 loc) · 3.16 KB

プロジェクト概要

  • 目的
    • 単純なHTTPサーバ・クライアントの実装を通して、ネットワークの基礎を理解する
  • 要件
    • 言語:C
      • システムコールを使用
    • プロトコル:HTTP/1.1
      • 機能
        • クライアント側
          • リクエストの送信
            • 加算演算をリクエストする機能を実装
              • 加算演算はint型で行うため32ビット符号付き整数の範囲内
                • 具体的には[-2147483648, 2147483647]の範囲
              • 負の数も括弧を使わずにクエリに含めることができる
                • 例:5 + -35+-3としてクエリに含める
            • リクエスト例:GET /calc?query=2+10 HTTP/1.1
        • サーバ側
          • GETリクエストの処理
            • 加算演算を実行するAPIエンドポイントを提供
            • レスポンス例:HTTP/1.1 200 OK\r\nContent-Length:2\r\n\r\n12

実装内容

  • ファイル構成

    • server.c:HTTPサーバのロジック 0. ソケットの作成とバインド

      • socket(): 通信エンドポイントを作成・ファイルディスクリプタを返す
        • domain: AF_INET(IPv4)
        • protocol: SOCK_STREAM (信頼性の高い通信)
      • bind(): ソケットにアドレスを割り当てる
        • socket address familyがAF_INETの場合、struct sockaddr_inを使用
      1. クライアントからの接続受付
      • listen(): accept()で接続を待機するための準備
      • accept(): クライアントからの接続を受け入れ、新しいソケットを作成
      1. リクエストの受信と解析
      2. 指定された処理の実行
      3. レスポンスの生成と送信
      4. ソケットのクローズ
    • client.c:HTTPクライアントのロジック 0. ソケットの作成

      1. サーバへの接続
      2. リクエストの生成と送信
      3. レスポンスの受信と表示
      4. ソケットのクローズ
    • Makefile:ビルド用Makefile

  • ビルド手順

    • このディレクトリ直下で以下を実行
      make
  • 実行手順

    • ビルド後、以下を実行してサーバを起動
      ./server
    • デフォルトでポート8080で待機
      • ブラウザまたはcurlでアクセス可能
        • 例:curl "http://localhost:8080/calc?query=5+3"
      • 終了するにはCtrl+Cを押す

補足

  • そもそもソケットとは?
    • 任意のプロセス間通信行うための抽象化されたインタフェース
    • プロセス間通信の一つとしてインターネット通信があるという構造
  • 全体の流れ
    1. 上位のサーバソケットの作成
    2. ポートをバインドする
    3. デーモンを初期化する
    4. デーモンプロセスで待機する
    5. 接続を許可してクライアント用のソケットを作成する
    6. リクエストの処理をする
    7. クライアント用のソケットを閉じる
    8. 4に戻る

参考資料