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