是否有一个功能可以检查名为sptr的sockaddr *是否指向ipv4或ipv6地址?

时间:2019-02-05 04:08:44

标签: c sockets

是否存在检查名为sockaddr *的{​​{1}}指向ipv4或ipv6地址的函数? 例如,我有下面的代码,如何添加到该地址以获取地址是ipv4还是ipv6,我可以使用sptr吗?

getaddrinfo()

2 个答案:

答案 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_INETAF_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字符串。