ソケットでCLIで動くチャットを作る
アイデアですt6o_o6t.icon
勉強会でやるにはいい題材だと思う
概要
C言語で実装する
新入生が授業で扱うので親しみが深いから、みたいな理由ですかね?
技術的な勉強という意味ではRustもすき
歴史的な理由によりますt6o_o6t.icon
ソケットはUNIXの一部として開発されました
たしか
ソケットのAPIがC言語で書かれているので、それをもっとも自然に扱えるのもC言語だろう、という考えでした
例えばPythonだと、ソケットである必要がないですね
よりユーザーが使いやすいようになっているはずです
このアイデアはソケットありきです
普段使っているライブラリの根っこに何があるのか、知ってもらいたい
UDP
TCP
🙆iNoma.icon
チャットはエスケープシーケンスを用いて、つねに最新10件を表示する
1. サーバーの実装
サーバーはアクセスを待ち受けて、訪問したクライアントに対してクライアントソケットを作成する。
クライアントソケットにおける通信では、特定クライアントから受信した文字列をそのまま他のクライアントに送信する。
2. クライアントの実装
クライアントはサーバーにアクセスする。
1. ビューアプロセスの実装
サーバーから受信したメッセージを10件まで保存し、最新20件を表示する。
forkでプロセスを作成する。
2. テキスト入力プロセスの実装
いや、プロセスを複数作ったからといって複数の画面が開かれるわけではないな…
https://dev.grapecity.co.jp/support/powernews/column/clang/047/page01.htm
こういうのを使って、キー入力を待ちながら出力も行う形になるのか
いや、大丈夫だと思うよ
普段やらないだけで、標準入力と標準出力は別々に扱えると思う
別のファイルだし
現在入力中の内容はファイルにもflushされてないし
ChatGPTに聞いたらこういうのは「echo server」と呼ぶと言われた
んー、なんか違うような、まあいいけど!
違うよね?echo serverはクライアントから受け取ったメッセージをそのままレスポンスするサーバーのこと
P2P?
両方ともサーバーにしたらどうなるの?
どうもならない。
UDPのほうが楽?
いろんな構成が考えられる
TCP
通信は1対1
自分以外に4人いたら、4つのソケットにメッセージを送る必要がある
これはクライアントが実行するには非効率的なので、中央にサーバーを置いた方がいいよね
こういう考えになる
UDP
通信は1対多
自分以外に4人いても、sockaddrポインタの配列を持っておいて、1つのソケットを介して順番に各送信先に送っていけばよい
UDPであれば、通信相手全員にマルチキャストで送信することが可能
複数人チャットでなくてもよいのでは
1対1のチャットを考えれば中央サーバーのこと考えなくていい
これで行こう