【发布时间】:2021-01-23 02:28:31
【问题描述】:
我是 C 和套接字编程的新手,仍在 sockaddr_in 结构中挣扎:
struct sockaddr_in {
short sin_family; /* Protocol family (always AF_INET) */
unsigned short sin_port; /* Port number in network byte order */
struct in_addr sin_addr; /* IP address in network byte order */
unsigned char sin_zero[8]; /* Pad to sizeof(struct sockaddr) */
};
和
struct in_addr {
uint32_t s_addr; /* Address in network byte order (big-endian) */
};
除了对齐要求,我不确定sin_zero是否需要,以下是我的假设,如果我错了,请纠正我:
假设1-因为sin_addr是32位的ipv4地址,如果我们需要一个ipv6地址,那么sin_zero的前4个字节将被分配并与sin_addr组合成一个64位的ipv6地址。
假设2-如果我的假设是正确的,那么我们需要指定套接字地址的长度,例如:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
是因为ipv6地址的可能性吗?所以如果使用ipv4,那么addrlen应该是8,如果使用ipv6,那么addrlen应该是12?
【问题讨论】:
-
根据stackoverflow.com/questions/18609397/…
sizeof(sockaddr_in6) > sizeof(sockaddr) == sizeof(sockaddr_in)sockaddr_in 需要至少与 sockaddr 一样大的原因是,您可以分配一个 sockaddr_in,然后在将其传递给库函数时将其转换为 sockaddr - 这有点像 C 的继承。sockaddr_in6 已经比 sockaddr 大,所以它不需要任何填充。