!!! リポジトリ,コンパイル,実行 まずはサンプルプログラムで動作を確認しましょう. 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 -aを実行すれば確認できます) このクライアントは,複数同時に接続できます.サーバのメッセージに表示される番号を確認しましょう. 各クライアントは,サーバに対してメッセージを送ることができます.何かキーボードから打ち込んで,サーバの画面を確認してみましょう. !!! TCP/IP とソケット(Socket プログラム) !! 通信相手 Cのプログラムからは,通信相手(のプロセス)がどう見えているか? * オープンされたファイル,として見えます.Linuxではファイル識別子です. 相手へメッセージを送るには? * ファイル識別子に対して書き込みを行う(writeシステムコールする)と,相手にバイト列が送られます. 相手からのメッセージを読むには? * ファイル識別子から読む (read システムコールする) と相手から送られたバイト列が届きます. メッセージが届いているか確かめる * select システムコールにより,ファイル識別子にデータが届いているかどうか試すことができます. ** select は同時にたくさんの通信相手からのデータの到着を調べることができます. ** select によりたくさんの相手との非同期的な入力を実現できます. !! サーバとクライアント socket には, サーバソケットとクライアントソケットがあります. * 接続される方がサーバで、 * 接続する方がクライアントです. !! ソケットの作成 ! サーバ側 [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 で接続が確立すれば終了して戻ってきます. ! クライアント側 [csd_socket.c|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/socket/stream/csd_socket.c] の ConnectServer関数 socket システムコール * サーバのIP アドレスとポート番号を指定してソケットを作ります * 成功すればファイル識別子が返ってきます * まだ実際には接続されていません 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 * チャットクライアントプログラム.