ファイヤープロジェクト
PF_UNIX
2003-07-20T15:13+09:00   matsu
PF_UNIXでソケット通信してみる.
ソケット通信はサーバクライアントモデルである.一方がサーバとして接続を待ち,もう一方がクライアントとして接続する.が,つながってしまえば両者に違いはない.また,ソケットディスクリプタをファイルディスクリプタと同様に扱える.SOCK_STREAMの場合,ソケット通信する際の処理の基本的な流れは大体以下のようになるだろうか.
サーバクライアント
socketsocket
bind
listen
acceptconnect
何かする何かする
closeclose
以下さらに注意点を示す.
  • サーバがlistenする前にクライアントがconnectするとおなじみの(?)Connection refusedになる.
  • サーバはacceptすることで,クライアントとのSocketを作成する.すなわちサーバは接続待ち用のSocketを一つ作成してそこで接続要求を待ち,接続要求を受け付けると(acceptすると)新たなSocketを作成してクライアントとの通信はそちらで行なう.接続待ち用のSocketは影響を受けずに接続待ち用でありつづける.
  • サーバがaccpetした時にクライアントからのconnectがなければ,クライアントがconnectするまでサーバのacceptはブロックされる.
  • ソケットディスクリプタはサーバとクライアントの両方でcloseしなければならない.
PF_UNIX(またはPF_LOCAL)では,ファイルシステムにソケットファイルというファイルを作成し,それを介して通信をする.
$ ls -lF server-socket
srwxr-xr-x    1 matsu    matsu           0  4月 19 23:57 server-socket=
ファイルタイプにsがあり,ファイル名のあとに=がつく.Cプログラムでソケットファイルかどうかを確認する例を後述のサーバのサンプルに示した.以下,注意点.
  • ソケットファイルがないと通信できない.
  • ソケットファイルがあってもそれを使用してサーバがlistenしていないとクライアントはconnectできない.
PF_UNIXではソケットタイプにSOCK_STREAMとSOCK_DGRAMがある.SOCK_DGRAMだとメッセージ境界が保存されるらしい.また,ファイルシステムを使用しているだけに,雑音は入らないと想定されている.また,ファイルディスクリプタや認証に利用できるunix信任状を送受信できるらしい.
SOCK_STREAMを指定したクライアントから送信された文字列を大文字に変換して送り返すサーバを作成してみた.
そしてサーバに文字列を送信して,サーバから返された文字列を表示するクライアントを作成してみた.
以下実行結果.
$ ./pf-unix-server &
$ ./pf-unix-client 
sended msg:     hogeFUGAfoo
received msg:   HOGEFUGAFOO
matsu(C)
Since 2002
Mail to matsu