我是 C++ 新手,可以对以下句子进行一些澄清:
“指向 struct sockaddr_in 的指针可以转换为指向 struct sockaddr 的指针,反之亦然。因此,即使 connect() 需要 struct sockaddr*,您仍然可以使用 struct sockaddr_in 并在最后一分钟进行转换!”
这句话是什么意思?
假设你有
struct sockaddr_in *var;
你有
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
你可以做:
connect(fd, (struct sockaddr *) var, addrlen);
这是因为那些函数族并不总是接收 sockaddr_in,它们可以接收,例如 sockaddr_in6。因此,您可以将两个指针都转换为 sockaddr 并且它们会起作用。
如何?认为这些结构的第一个字段是相同的,如果将它们强制转换为 sock_addr 您仍然可以读取第一个字段而没有未定义的行为,然后将它们作为该字段定义的特定结构处理。
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
sa_family 字段将与 sin_family 字段相同,因此您可以在转换之前知道它是 AF_INET 还是 AF_INET6。