很简单的问题。 是的,也许不是那么重要,但我真的很好奇他们是什么意思,我找不到他们的意思。
// ipv4 struct sockaddr_in { short int sin_family; // Address family, AF_INET unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8]; // Same size as struct sockaddr }; // ipv4 struct in_addr { uint32_t s_addr; // that's a 32-bit int (4 bytes) }; // ipv6 struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc. int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM int ai_protocol; // use 0 for "any" size_t ai_addrlen; // size of ai_addr in bytes struct sockaddr *ai_addr; // struct sockaddr_in or _in6 char *ai_canonname; // full canonical hostname struct addrinfo *ai_next; // linked list, next node }; // ipv6 struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address };
sin_
表示sockaddr_in
, ai_
表示addrinfo
, sa_
表示sockaddr
。 我不确定in_addr
的s_
。 socket API是在20世纪80年代早期的C编译器的基础上设计的,它可能对所有的struct
成员都有一个单一的命名空间。
拉斯曼大多是正确的,但这不仅仅是传统单名空间考虑的问题。 标准头文件中定义的所有结构都使用这种形式的名称,以避免在宏的应用程序的名称空间上进行操作 。 如果struct成员没有用ai_
, sin_
等作为前缀,那么在结构中包含的任何成员名称(包括甚至没有在C或POSIX标准中指定的扩展名)都会发生冲突并导致错误,如果应用程序定义了相同的名称一个预处理宏。 通过使用这些可以通过标准中的简单模式规则保留的“结构局部名称空间”(例如, netdb.h
保留ai_*
),保留供实现使用的名称和保留使用的名称之间有明显的区别应用程序和标准的新扩展或新修订不会导致冲突。
微软对in_addr
定义可能意味着“ S_
”前缀的意思是根据@R ..的答案来struct
,而对于union
而言则是“ un
”,然而它们使用大写字母“ S
”,而不像POSIX域。
typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
对于套接字结构“ s
”通常意味着“sock”是“套接字”的简称,所以看起来不是一个定义的原因。
为了好奇,关于IPv6支持的MSDN页面显示了struct in6_addr
其中包含名称s6_addr
意味着IPv4“ 套接字 ”结构的IPv6版本,而不仅仅是“IPv4结构”。