是否存在检查名为sockaddr *
的{{1}}指向ipv4或ipv6地址的函数?
例如,我有下面的代码,如何添加到该地址以获取地址是ipv4还是ipv6,我可以使用sptr
吗?
getaddrinfo()
答案 0 :(得分:1)
您可以测试import { App, test, } from 'path/to/App';
console.log(`test is: ${ test }`);
成员:
sa_family
如果switch (sptr->sa_family)
{
case AF_INET:
/* IPv4 */
break;
case AF_INET6:
/* IPv6 */
break;
default:
/* Something else */
}
成员是sa_family
,则表示IPv4地址,而套接字地址实际上是AF_INET
。如果struct sockaddr_in *
成员是sa_family
,则表示IPv6地址,而套接字地址实际上是AF_INET6
。
答案 1 :(得分:0)
AF_INET
和AF_INET6
地址族的结构不同,因此您必须为它们使用不同的指针类型。进行的方式是使用:
struct sockaddr *genptr;
... /* initialize genptr to point to the sockaddr structure */
switch (genptr->sa_family) {
case AF_INET: {
struct sockaddr_in *ipv4ptr = (struct sockaddr_in *)genptr;
/* check IPV4 addresses using ipv4ptr pointer */
} break;
case AF_INET6: {
struct sockaddr_in6 *ipv6ptr = (struct sockaddr_in6 *)genptr;
/* check IPV6 addresses using ipv6ptr pointer */
} break;
default: /* NEITHER IPV4 NOR IPV6, IPX? NETBIOS? X25? */
} /* switch */
尽管效率较低,但是您可以使用与版本无关的 inet_ntop(3)
例程来转换地址,并使用某种正则表达式匹配算法来部分匹配地址。 inet_ntop
例程获得通用指针,并一枪建立网络地址的ipv4 / ipv6 ascii字符串。