非常简单的问题。是的,也许不是那么重要,但我真的好奇他们的意思是什么,我找不到他们的意思。
// 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
};
答案 0 :(得分:30)
sin_
表示sockaddr_in
,ai_
表示addrinfo
,sa_
表示sockaddr
。我不确定s_
中的in_addr
。套接字API在设计时考虑了20世纪80年代早期的C编译器,它们可能只为所有struct
成员提供了一个命名空间。
答案 1 :(得分:12)
larsman大多是正确的,但这不仅仅是传统的单一命名空间考虑因素。标准头文件中定义的所有结构都使用此表单的名称,以避免踩到应用程序的宏命名空间。如果struct成员没有ai_
,sin_
等前缀,那么结构中包含的任何成员名称(包括甚至在C或POSIX标准中都没有指定的扩展名)都会发生冲突并导致错误如果应用程序定义了与预处理器宏相同的名称。通过使用可由标准中的简单模式规则保留的这些“struct-local命名空间”(例如,netdb.h
保留ai_*
),保留供实现使用的名称与保留供应用程序使用的名称,新标准的扩展或新修订不会导致冲突。
答案 2 :(得分:0)
in_addr
的{{3}}可能意味着“S_
”前缀意味着struct
根据@R ..的回答并看到“un
“对于union
,他们使用的资本”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
”通常意味着“套接字”是“套接字”的缩写,因此似乎没有定义原因。
为了好奇,Microsoft definition上的MSDN页面显示struct in6_addr
,其中包含名称s6_addr
,暗示IPv6版本的IPv4“套接字”结构,而不仅仅是“IPv4结构”。