ソフトウェア設計及び演習2017
ソケットプログラミング
リポジトリ,コンパイル,実行
まずはサンプルプログラムで動作を確認しましょう.
svn co https://wiki.cis.iwate-u.ac.jp/svn/csd/Examples/socket/stream cd stream make
班長さんが,自分の端末でサーバを立ち上げます.
./multi
班員は,各自,自分の端末からクライアントを立ち上げます.
./client サーバのIP
ここで,「サーバのIP」とは,班長さんの端末のIPアドレスです.(班長さんが自分の端末でifconfig eth0を実行すれば確認できます)
このクライアントは,複数同時に接続できます.サーバのメッセージに表示される番号を確認しましょう.
各クライアントは,サーバに対してメッセージを送り,サーバは,各クライアントにそのメッセージを流します.何かキーボードから打ち込んで,サーバ/クライアントの画面を確認してみましょう.
TCP/IP とソケット(Socket プログラム)
通信相手
Cのプログラムからは,通信相手(のプロセス)がどう見えているか?
- オープンされたファイル,として見えます.Linuxではファイル識別子です.
相手へメッセージを送るには?
- ファイル識別子に対して書き込みを行う(writeシステムコールする)と,相手にバイト列が送られます.
相手からのメッセージを読むには?
- ファイル識別子から読む (read システムコールする) と相手から送られたバイト列が届きます.
メッセージが届いているか確かめる
-
selectシステムコールを使うと,「ファイル識別子にデータが届いているかどうか」を試すことができます.
- selectは,同時に複数の通信相手から送られてくるデータの到着も調べることができます.
- selectにより,複数の相手に対する非同期的な通信を実現できます.
ソケットの作成
csd_socket.cのCreateServerSocket()関数
socketシステムコール
- ソケットを作成します.
- エラーがなければ,ファイル識別子が返ってきます.
bindシステムコール
- ソケットには,sockaddr_in構造体でサーバ側のIPアドレスとポート番号を与えます.
- ソケットを持ったプロセスと,IPアドレス/ポート番号をもったパケットが結び付きます.
listenシステムコール
- 待ち行列の長さを指定します.いまのところは無視して構いません.
echo-server.cのmain関数
accept システムコール
- クライアントからのconnectによる接続を待ちます.
- acceptは,クライアントからのconnectで接続が確立すれば終了します.
csd_socket.cのConnectServer関数
socketシステムコール
- サーバのIPアドレスとポート番号を指定して,クライアントソケットを作ります.
- エラーがなければファイル識別子が返ってきます.
- 実際に接続されるのは,次のconnectを呼んでから,です.(socketだけでは接続されません)
connectシステムコール
- サーバに対して接続にいきます.
- TCP/IP メモ
- TCP のコネクションのオープンに相当します
- SYN (クライアントからサーバへ)
- SYN/ACK (アクセプト状態のサーバからクライアントへ)
- ACK (クライアントからサーバへ)
接続が完了すれば,socketシステムコールで得たファイル識別子に対してread/writeすることでサーバと通信できます.
プログラム例
実行し,プログラムを読んでみましょう.
https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/socket/stream/serv.c
- 1対1のチャットサーバプログラム.
https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/socket/stream/multi.c
- 多人数 チャットサーバプログラム.
- selectの使い方がポイント
https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/socket/stream/client.c
- チャットクライアントプログラム.
最終更新日:2017/04/03 09:14:16