INETドメインのプロセス間通信プログラムの例
今度は、先程のプログラムを拡張し、離れたマシン上のプロセス同士でも 通信ができる(IENTドメインのソケットを使う)ようなプログラムを作ってみます。
通信の手順は前回のプログラムとほぼ同じです。しかし、通信相手の指定の仕 方が多少異なります。
サーバーとクライアントは離れたところにあるわけですから、 クライアントがサーバーに接続するには、まずサーバーのIPアドレスを指定する必要 があります。さらにサーバーのマシンが分かっても、そのマシンのどのプロセスと 通信したらよいのかわかりませんので、そのためにポート番号いうものが使われます。
では実際に、INETドメインのソケットを使ったプログラムを見てみましょう。
プログラムの中で使われている関数は、UNIXドメインの時とすべて同じです。 ただこの関数に渡す引数が多少異なります。
- ■ ソケットの生成(socket)
- UNIXドメインのソケットの時は第1引数に、PF_UNIXを指定しまましたが、ここでは INETドメインのソケットを使うので、PF_INETを指定します。
あとは、UNIXドメインの時と同じです。
- ■ ソケットアドレスの指定(bind)
int bind(int s, struct sockaddr *name, int namelen)UNIドメインの時は、第2引数にsockaddr_un構造体を使いましたが、 INETドメインの場合は、sockaddr_inを指定します。struct sockaddr_in { u_char sin_len; u_char sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };sin_familyにはAF_INETを指定します。
sin_addr.s_addrにはINADDR_ANYを指定します。これはサーバーがどんなマ シンからの接続でも受け付けることを示すものです。
sin_portにはポート番号を指定します。
- ■ 接続の準備(listen)
- listen()を使ってサーバーが接続の準備をするところはUNIXドメインの時と まったく同じです。
- ■ 接続要求(connect)
- 次に、クライアントがサーバーに対してconnect()コールによって接続要求を 出しますが、これもほんど前回のプログラムと同じです。 異なるのは、connect()に渡される引数です。
第2引数に、サーバーのアドレスとポート番号の情報が入った、sockaddr_in 構造体のポインタを渡します。この情報がないと、どのサーバーに接続 するのか分かりません。
- ■ 接続(accept)
- UNIXドメインのときと同じです。
- ■ 通信(write,read)
- write()、read() を使って通信するのもまったく同じです。
◆実行方法
- まず、2台のマシンにログインします。
- 片方のマシンで、
# ./serverとして先にサーバーを起動します。
- 次にもう一方のマシンで、
# ./client サーバー名として、クライアントを起動します。
- クライアントのマシンで文字を打ち込むと、大文字に変換されて表示されます。
![]()
![]()
![]()