gpt4 book ai didi

在 sockaddr 和 sockaddr_in6 之间转换

转载 作者:行者123 更新时间:2023-12-05 01:31:16 24 4
gpt4 key购买 nike

我一直在阅读 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";
}

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

最佳答案

ai_familyai_addraddrinfo 结构的字段,因此您引用的代码大概调用了 getaddrinfo() 预先。

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

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

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

这就是类型转换起作用的原因。

addrinfo::ai_addr 字段声明为 struct sockaddr* 因此它可以按原样传递给 addr 参数bind()connect() 函数没有类型转换。 addrinfo::ai_addrlen 字段可以按原样传递给它们的 addrlen 参数。

关于在 sockaddr 和 sockaddr_in6 之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39154225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com