UDP limited broadcast が送出できない問題ですが、OS を
6.1-RELEASE から 7.2- RELEASE に切替えてみたところ、

1) fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)
2) setsockopt(fd , IPPROTO_IP, IP_ONESBCAST, ..)

の組合せでうまく動作することがわかりました。注意点は

1) sin.sin_addr.s_addr は 255.255.255.255 でなく、自分の
   ネットワークの broadcast address にする (これで、送信
   時に 255.255.255.255 に変更される。255.255.255.255 を
   指定すると、うまくゆかない)
2) SOCK_UDP で soket() を作ると、うまくゆかない。
3) SO_BROADCAST の socket option は要らない。

で、ip(4) の SOCK_UDP でも使えるという記述とは矛盾するよ
うです。

多分、

  http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/99558

このあたりから修正されたのではないかと思います。SOCK_RAW
だと IP packet を組み立てる手間は増えますが、とりあえず
解決。

平林 浩一

メールによる返信