最終更新:2026-10-12
C++20 コルーチン HTTP サーバ¶
モダン C++ HTTP サーバ¶
最近、星球の仲間からネットワーク関連のプロジェクトはないかとよく聞かれるので、モダン C++ + CMake 管理による完全なプロジェクトを書きました。
このプロジェクトには次のような特徴があります:
- モダン C++ の機能をふんだんに使用
- C++20 関連
- cortouine
- concept
- std::format
- std::span
- C++17 関連
- if 文の初期化
- 構造化束縛
- optional
- 高効率なイベント駆動機構
epollによるイベントループを実装し、大量のクライアント接続を管理します。epollは Linux プラットフォームで高並行 I/O を扱う効率的なツールであり、複数のファイル記述子のイベントを同時に監視できるため、システムコールのオーバーヘッドを効果的に削減し、I/O 操作の並行性を高めます。- サーバはメインのイベントループで非ブロッキング
epoll_waitにより接続イベントを監視し、従来のブロッキング I/O による性能ボトルネックを回避しています。 - コルーチンと非同期プログラミング
- C++20 コルーチンを採用して非同期タスクの実装を簡素化し、同期コードと似た書き味を提供することで、コードロジックをより明快にしています。プロジェクトでは
co_awaitでクライアントデータの読み書きを非同期に行い、スレッドのコンテキストスイッチのオーバーヘッドを削減しています。 SocketAwaiterとAsyncSocketOperationの 2 つのクラスを実装し、ソケットの非同期読み書き操作をカプセル化して、非同期処理コードをより簡潔かつ自然に書けるようにしています。- ファイル I/O 操作の非同期処理
- サーバは HTML ファイル内容の非同期読み込みをサポートし、
std::asyncによる非同期ファイル読み込みでメインスレッドのブロックを避け、クライアントのリクエストにより速く応答できるようにしています。 - リクエスト処理時には、必要なファイルを非同期で読み込んでメモリにキャッシュし、I/O 操作が性能に与える影響を軽減しています。
- 非ブロッキングソケット操作
fcntlでソケットを非ブロッキングモードに設定し、acceptやread/write操作がサーバのメインスレッドをブロックしないようにします。これは高並行のシナリオでは特に重要で、サーバの並行処理能力を大幅に向上させます。
プロジェクトの実行結果:
学習方法:詳細なドキュメント+コードが用意されており、単体で購入する場合は下の WeChat へ、または星球にご参加ください。
関連トピック¶
- C++ FnOnce を手書きする | C++那些事
- C++ gRPC ミニプロジェクト | C++那些事
- C++ プロセス間通信実践 | C++那些事
- C++ 短縮URLサービス Demo | C++那些事
- C++17 と SQLite でディレクトリサイズを集計 | C++那些事
- Google Benchmark 性能テスト | C++那些事
- Protobuf ZeroCopy シリアライズ | C++那些事
- pybind11 で Python を高速化 | C++那些事
- C++ スタック型電卓の設計 | C++那些事