我是C ++的新手,可以对以下句子进行一些澄清:
“指向struct sockaddr_in的指针可以强制转换为指向struct sockaddr的指针,反之亦然。所以即使connect()想要一个struct sockaddr *,你仍然可以使用struct sockaddr_in并在最后抛出它分钟!“
这句话是什么意思?
答案 0 :(得分:1)
假设你有
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。