C言語でチャットアプリを作ろう
もともとこのページはただのメモ書きだったが、「C言語 チャットアプリ」と検索して訪れた初学者に申し訳ないので、少しちゃんと書いてみるt6o_o6t.icon
今回作るのは、ターミナル上で動作する簡易なチャットアプリです。
たぶん同じようなことを、netcatを工夫して使えば実現できるのだろうが、自分で書いてみよう GUIでグラフィカルに動作するようなものではありません。
作る機能の概要
1. サーバを起動
$ ./server ポート(省略可)
デフォルトでは、3000番で動作します。
2. クライアントを起動
$ ./client IPアドレス ポート(省略可)
起動すると、名前の入力欄が表示されます。
3. チャットルームに接続
クライアントで名前を送信すると、チャットルームへの接続が行われる。
これ以降、クライアントはサーバを介して、他クライアントからのメッセージを受信したり、逆に送信したりできる。
4. チャットから切断
クライアントでCtrl + Cを押すと、クライアントは終了する。
実装のポイント
BSDソケット
サーバとクライアントは、TCP上で通信を行います。
UNIXでTCP通信を扱う場合、BSDソケットを使うことが選択肢の一つとなります。
BSDソケットでの通信方法については、本記事では詳しく扱いません。
Select
今回のプログラミングの要となる概念です。
Selectを使わなくても、他に方法はあると思いますが..t6o_o6t.icon
ユーザ入力を待ちつつ、BSDソケットからのパケットを待つために、Selectを用いて同時に待機することができます。
ANSI Escape
通常、単に標準出力するだけでは、文字色やカーソルの位置を自由に変えることはできません。
ANSI Escapeにしたがって制御コードを出力すると、カーソルの位置などを自由に変更することができます。
/icons/hr.icon
作ったときのメモ
概要
説明
日時
2023/10/21(土)11:30~18:00
対象
考え中
C言語を知らない人(=1年生)向けにやると、C言語の基礎文法から必要
基礎文法を知っていそうな人は、数人いると思う
C言語を知っている人(=2年生以上)には、簡単すぎる
知ることのできる技術
ソケットAPI
マルチスレッド
今回作るアプリ
サーバー
動作の概要
サーバーソケットで、接続要求を待機する
接続要求が来たらacceptして、クライアントソケットを払い出す
クライアントソケット
複数のクライアントと同時に通信する
クライアント
アプリを起動すると、チャットルーム(仮に127.0.0.1:1000とする)に接続される
IPを割り振るのはサーバーだから、私物のPCでサーバーを立てる場合はここにIPを書く
チャットを起動する
$ ./chat username hostIP hostPort
コマンドのUsage
code:usage.txt
Usage:
./chat username hostIP hostPort
画面(チャットルーム)
https://scrapbox.io/files/6502f4e1f04b68001c27c73e.png
本体
ウィンドウ幅
100文字
ウィンドウ高さ
40行
表示例
code:body_example.txt
message content message content message content
message
Input
ユーザーが入力を行う。
Info
code:info_example.txt
logged in as username (serverIP:serverPort)
$ mode con
ターミナル内に3つのウィンドウが表示される
https://scrapbox.io/files/6502d96acec8f4001be026c1.png
Windowを複数開く方法がない..
$ start cmd /k "..."
これで可能
クライアント構成
TCPソケット
ノンブロッキングなソケットを用いる。
selectで、入力データがあったとき以外は休眠させる。
入力
具体的な実装の準備が整った
リファレンス実装(WIP)
現時点では、すべてのソケットはlocalhostにbind or connectするようになっている
とりあえずチャットする部分までは完成済
ユーザー名などをやり取りできれば完成
仕組み
ソケットの入力とターミナルからの標準入力は別のfdを使うから、selectでまとめて入力待ちする