UNIXドメインソケットでデータグラムを使うと、UDPの欠点が全く表に出てこないので便利。
- データが送信単位で分割される
- データがなくならない
- データの順番は狂わない
- 接続先がいないときはちゃんと接続エラーになる
UDSに対してもSO_RCVBUFや*1SO_RCVTIMEOはちゃんと使えるので、思ってる以上に適当に利用できる。
UDSデータグラムサーバ
int sd,len; unsigned char data[256]; struct sockaddr_un addr = { .sun_path = "/tmp/HOGE", .sun_family = AF_UNIX, }; /* サーバ部分 */ sd = socket( AF_UNIX, SOCK_DGRAM, 0 ); unlink(addr.sun_path); bind( sd, (struct sockaddr *)&addr, sizeof(addr) ); while( (len=read(sd,data,sizeof(data))) > 0 ){ printf("recv:%.*s\n",len,data); }
UDSデータグラムクライアント
/* クライアント部分 */ sd = socket( AF_UNIX, SOCK_DGRAM, 0 ); sendto( sd, "Hello,world!", 12, 0, (struct sockaddr *)&addr, sizeof(addr) ); sendto( sd, "Hello,world!", 12, 0, (struct sockaddr *)&addr, sizeof(addr) ); sendto( sd, "Hello,world!", 12, 0, (struct sockaddr *)&addr, sizeof(addr) );
*1:使えなかった