[英]Determine if ipv4 or ipv6 data structure
在內核模塊中,給定一個將sa_family
初始化為AF_UNSPEC
的struct sockaddr
,如何可靠地確定它是struct sockaddr_in
還是struct sockaddr_in6
? 在Linux 3.16.0-4-686-pae(x86)上。
struct sockaddr {
unsigned short sa_family; // AF_UNSPEC
char sa_data[14]; // ?
};
struct sockaddr_in {
unsigned short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct sockaddr_in6 {
unsigned short sin6_family;
unsigned short sin6_port;
unsigned int sin6_flowinfo;
struct in6_addr sin6_addr;
unsigned int sin6_scope_id;
};
通常,當某些東西調用內核並給出struct sockaddr
,它還必須給出struct sockaddr
的長度。 例如,參見sendto()
:
ssize_t sendto (int sockfd, const void *buf, size_t buflen, int flags,
const struct sockaddr *addr, socklen_t addrlen);
使用緩沖區的大小,您應該能夠對需要使用哪種類型的sockaddr
做出很好的猜測:
if (addr.sa_family == AF_UNSPEC) {
switch (addrlen) {
case sizeof (struct sockaddr_in): {
addr.sa_family = AF_INET;
break;
}
case sizeof (struct sockaddr_in6): {
addr.sa_family = AF_INET6;
break;
}
default: {
// handle error
break;
}
}
}
在理想情況下, sa_family
應該已經設置為AF_INET
(IPv4)或AF_INET6
(IPv6),但是不幸的是,這里似乎不是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.