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() を使って通信するのもまったく同じです。

◆実行方法

  1. まず、2台のマシンにログインします。

  2. 片方のマシンで、
        # ./server
    
    として先にサーバーを起動します。

  3. 次にもう一方のマシンで、
        # ./client サーバー名
    
    として、クライアントを起動します。

  4. クライアントのマシンで文字を打ち込むと、大文字に変換されて表示されます。