IPv6 RAW_SOCKET
2007/08/01
IPv4とIPv6のプログラム(アプリケーションから見た違い)
といっても、socket(AF_INET)がAF_INET6になったくらいの事なら特にアプリケーション側で意識しなければならないのはアドレスが4byte(32bit)から16byte(128bit)になったこと。
値のコピーは構造体同士であり、ポインタも含まれないので普通に = でコピーすれば問題ない。ただ、アドレスのチェックの所はデータが4byte単位なのでたぶん問題ないと思うけど、memcmp()を使って構造体を比較すると、ゴミがスキマ埋めされていて正しく比較されないことがあるんじゃないかと。
そこまで気にする必要はないか。
一歩堀下がって、
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/raw.7.html
ここで書かれているように(いや、まぁいまやっているのはLinuxじゃなくてBSD系じゃなかったか? という突っ込みは置いておいて)、IPv4の頃はsocket(AF_INET, RAW_SOCKET, hoge)で開いてsetsockopt(,IP_HDRINCL ,)でごにょごにょするとIPヘッダを自分で編集して送信、受信することができたが、IPv6ではこれが不可能。
どうやるのかとしばらく調べていたところ、RAW_SOCKETで開くのは同じで、connect()してsendto()を使わずに、bind()でソースアドレスをして、送信したいヘッダ情報を作成してsendmsg()で送信するらしい。
詳しくはまた後日に?