PF_UNIX
PF_UNIXでソケット通信してみる.
ソケット通信はサーバクライアントモデルである.一方がサーバとして接続を待ち,もう一方がクライアントとして接続する.が,つながってしまえば両者に違いはない.また,ソケットディスクリプタをファイルディスクリプタと同様に扱える.SOCK_STREAMの場合,ソケット通信する際の処理の基本的な流れは大体以下のようになるだろうか.
以下さらに注意点を示す.
| サーバ | クライアント |
|---|---|
| socket | socket |
| bind | |
| listen | |
| accept | connect |
| 何かする | 何かする |
| close | close |
- サーバが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できない.
SOCK_STREAMを指定したクライアントから送信された文字列を大文字に変換して送り返すサーバを作成してみた.
そしてサーバに文字列を送信して,サーバから返された文字列を表示するクライアントを作成してみた.
以下実行結果.
$ ./pf-unix-server & $ ./pf-unix-client sended msg: hogeFUGAfoo received msg: HOGEFUGAFOO

