ft_irc
2025.08 – 2025.09C++で実装したIRCサーバー
C++IRCNetwork
概要
C++でIRC(Internet Relay Chat)サーバーを3人チームで開発。 複数クライアントの同時接続、チャンネル機能、プライベートメッセージなど13種のIRCコマンドに対応し、poll()を用いたノンブロッキングI/Oで多重化処理を実現した。 RFC 2812に準拠した実装を行い、仕様への対応と拡張性を両立する設計を意識した。

担当範囲
- •poll()を用いたノンブロッキングI/O、接続管理、イベントループの実装
- •クライアント・チャンネル状態の一元管理
- •接続状態管理、バッファ処理、認証フロー
- •IRCコマンド:USER, PASS, NICK, PRIVMSG, PING, PONG, CAP, INVITE, MODE, QUITの実装
ポイント
- •Commandパターンによる拡張性と保守性を両立した設計
- •コマンド処理とネットワークI/Oの責務分離による影響範囲の最小化
- •RFCベースの仕様に基づいた実装
- •チーム開発におけるプロセス設計(PR/CI)の運用
苦労・工夫した点
IRCはRFC 2812に基づく仕様が存在するが、コマンドごとに細かな仕様やエッジケースが存在する。そのため、RFCの読み込みに加え、既存IRCサーバーの挙動を検証し、実際の動作を確認した上で実装を進めた。 設計面では、コマンド数の増加に伴う条件分岐の肥大化を避けるために、Commandパターンとファクトリメソッドを採用。各コマンドを独立したクラスとして実装し、共通インターフェースで扱うことで、コマンド追加時の修正範囲を限定し、分岐ロジックの複雑化を防止する構造とした。 また、コマンド処理とネットワークI/Oで責務の混在を避けるために、実行結果を共通の構造体で返す設計を採用した。「送信内容・送信対象・切断有無」をひとまとまりのデータとして扱うことで、コマンドロジックとネットワーク処理の責務を明確に分離した。 チーム開発では、PRテンプレートとGitHub ActionsによるCIを導入し、レビュー観点の統一と品質の担保を行なった。これにより、並行開発においても大きな手戻りなく開発を進めることができた。