!!! リポジトリ,コンパイル,実行 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 !! TCP/IP とソケット !!! Socket プログラム !! 通信相手 C のプログラムから通信相手(のプロセス)がどう見えるか * オープンされたファイルに見えます.Unix ではファイル識別子となります 相手へメッセージを送る * ファイル識別子へ書く (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 * チャットクライアントプログラム.