ファイヤープロジェクト
PF_INET
2003-07-20T15:13+09:00   matsu
PF_INET,SOCK_DGRAMでソケット通信してみる.
SOCK_STREAMでの流れはPF_UNIXの場合と同様であるので,ここではSOCK_DGRAMでの流れを示す.
サーバクライアント
socketsocket
bind
recvfromsendto
何かする何かする
closeclose
さらにPF_INETでの注意点.serverでbindに渡す引数
struct sockaddr *myaddr
は実際には
struct sockaddr_in {
   sa_family_t    sin_family; /* address family: AF_INET */
   u_int16_t      sin_port;   /* port in network byte order */
   struct in_addr  sin_addr;  /* internet address */
};
であり,
  • sin_familyにはPF_INET
  • sin_portには待ち受けポート番号(ネットワークバイトオーダ)
  • sin_addrには接続を許可するIPアドレス
を格納する.さらにsin_addrは
/* Internet address. */
struct in_addr {
   u_int32_t      s_addr;     /* address in network byte order */
};
である(どちらもman ipより).sin_port,s_addrはネットワークバイトオーダである.また,s_addrを直接入力する以外に,sin_addrをinet_atonを使用する方法がある.後述のサンプルのサーバで前者の,クライアントで後者の例を示した.次にそしてSOCK_DGRAMでの注意点を示す.
  • サーバはlisten,acceptなしでいきなりrecvfromに突入できる.
  • クライアントはconnectなしでいきなりsendtoに突入できる.
SOCK_DGRAMはコネクションレスなのでこんな感じになっている(のだと思う).
PF_INET,SOCK_DGRAMを指定したソケット通信のサンプルを以下に示す.まずサーバ.
server_addr.sin_addr.s_addrは接続を待つNICのIPを示し,
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
と,INADDR_ANYをネットワークバイトオーダで格納することによって,すべてのNICでの接続を許可している(これはbindで反映される).次にクライアント.
クライアントではserver_addrに接続するサーバのネットワーク情報を格納する.実行結果を以下に示す.まずサーバ.
$ ./pf-inet-server 9999
starting server: port = 9999
recved msg from 192.168.1.2:32769
recv msg: "hoge"
recved msg from 192.168.1.2:32769
recv msg: "hogeFUGA"
recved msg from 192.168.1.2:32769
recv msg: "hogeFUGAfoo"
recved msg from 192.168.1.2:32769
recv msg: "exit"
そしてクライアント.
$ ./pf-inet-client 192.168.1.1 9999 hoge
$ ./pf-inet-client 192.168.1.1 9999 hogeFUGA
$ ./pf-inet-client 192.168.1.1 9999 hogeFUGAfoo
$ ./pf-inet-client 192.168.1.1 9999 exit
matsu(C)
Since 2002
Mail to matsu