在sockaddr和sockaddr_in6之间进行转换

时间:2016-08-25 20:28:12

标签: c sockets networking network-programming

我一直在阅读Beej的网络编程指南,在他的一个例子中,他向struct sockaddr指针指向struct sockaddr_in6指针,如下所示。

    void *addr;
    char *ipver;

    // get the pointer to the address itself,
    // different fields in IPv4 and IPv6:
    if (p->ai_family == AF_INET) { // IPv4
        struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
        addr = &(ipv4->sin_addr);
        ipver = "IPv4";
    } else { // IPv6
        struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
        addr = &(ipv6->sin6_addr);
        ipver = "IPv6";
    }

这怎么可能,因为结构的大小不同?

1 个答案:

答案 0 :(得分:4)

cd plugins mkdir real-plugin-folder ln -s respository-folder/real-plugin-folder/plugin.php real-plugin-folder/plugin.php ai_familyai_addr结构的字段,因此您所引用的代码可能事先称为addrinfo

getaddrinfo()的结果是getaddrinfo()结构的以NULL结尾的链表,其中addrinfo字段是指向已分配的内存块的指针,该内存块的大小足以容纳报告的addrinfo::ai_addr类型的套接字地址。地址大小在addrinfo::ai_family字段中报告。

对于addrinfo::ai_addrlenAF_INET字段指向包含addrinfo::ai_addr结构的内存块。

对于sockaddr_inAF_INET6字段指向包含addrinfo::ai_addr结构的内存块。

这就是为什么类型转换有效。

sockaddr_in6字段被声明为addrinfo::ai_addr,因此可以按原样传递给struct sockaddr*addr函数的bind()参数,而无需输入-铸件。 connect()字段可以按原样传递到addrinfo::ai_addrlen参数。