ft_irc

2025.08 – 2025.09

C++で実装したIRCサーバー

C++IRCNetwork

概要

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

ft_irc

担当範囲

  • 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を導入し、レビュー観点の統一と品質の担保を行なった。これにより、並行開発においても大きな手戻りなく開発を進めることができた。

関連リンク