PF_INET
PF_INET,SOCK_DGRAMでソケット通信してみる.
SOCK_STREAMでの流れはPF_UNIXの場合と同様であるので,ここではSOCK_DGRAMでの流れを示す.
さらにPF_INETでの注意点.serverでbindに渡す引数
| サーバ | クライアント |
|---|---|
| socket | socket |
| bind | |
| recvfrom | sendto |
| 何かする | 何かする |
| close | close |
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アドレス
/* 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に突入できる.
PF_INET,SOCK_DGRAMを指定したソケット通信のサンプルを以下に示す.まずサーバ.
server_addr.sin_addr.s_addrは接続を待つNICのIPを示し,
クライアントではserver_addrに接続するサーバのネットワーク情報を格納する.実行結果を以下に示す.まずサーバ.
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);と,INADDR_ANYをネットワークバイトオーダで格納することによって,すべてのNICでの接続を許可している(これはbindで反映される).次にクライアント.
$ ./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

