我一直在阅读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";
}
这怎么可能,因为结构的大小不同?
答案 0 :(得分:4)
cd plugins
mkdir real-plugin-folder
ln -s respository-folder/real-plugin-folder/plugin.php real-plugin-folder/plugin.php
和ai_family
是ai_addr
结构的字段,因此您所引用的代码可能事先称为addrinfo
。
getaddrinfo()
的结果是getaddrinfo()
结构的以NULL结尾的链表,其中addrinfo
字段是指向已分配的内存块的指针,该内存块的大小足以容纳报告的addrinfo::ai_addr
类型的套接字地址。地址大小在addrinfo::ai_family
字段中报告。
对于addrinfo::ai_addrlen
,AF_INET
字段指向包含addrinfo::ai_addr
结构的内存块。
对于sockaddr_in
,AF_INET6
字段指向包含addrinfo::ai_addr
结构的内存块。
这就是为什么类型转换有效。
sockaddr_in6
字段被声明为addrinfo::ai_addr
,因此可以按原样传递给struct sockaddr*
和addr
函数的bind()
参数,而无需输入-铸件。 connect()
字段可以按原样传递到addrinfo::ai_addrlen
参数。