ソフトウェア設計及び演習2015

ソケットプログラミング

リポジトリ,コンパイル,実行

まずはサンプルプログラムで動作を確認しましょう.

 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により,複数の相手に対する非同期的な通信を実現できます.

サーバとクライアント

socketには,サーバソケットとクライアントソケットが存在します.

  • 接続される方がサーバで,
  • 接続する方がクライアントです,

ソケットの作成

サーバ側

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

  • チャットクライアントプログラム.


最終更新日:2015/03/05 10:01:21