Beej の Guide to Networking を使用していて、エイリアシングの問題に遭遇しました。彼は、特定の構造体の IPv4 または IPv6 アドレスを返す関数を提案しています。
1 void *get_in_addr( struct sockaddr *sa )
2 {
3 if (sa->sa_family == AF_INET)
4 return &(((struct sockaddr_in*)sa)->sin_addr);
5 else
6 return &(((struct sockaddr_in6*)sa)->sin6_addr);
7 }
これにより、GCC は 3 行目のsaに対して厳密なエイリアス エラーを吐き出します。私が理解しているように、この関数を次のように呼び出しているためです。
struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
connection_name,
sizeof connection_name);
エイリアシングは、their_addr
変数の型sockaddr_storage
が異なり、別の型の別のポインターが同じメモリを指しているという事実に関係していると思います。
sockaddr_storage
このくっついている、sockaddr_in
、およびを回避する最善の方法はありsockaddr_in6
ますか? これはネットワーキングの分野でよく使われているように思えますが、ベスト プラクティスの良い例が見つかりません。
また、エイリアシングの問題がどこで発生するかを正確に説明できる人がいれば、非常にありがたいです。