IP结构中的缩写"s_","ai_","sin_","in"(如果是这样)是什么意思?

Kir*_*rov 16 c sockets linux ip network-programming

非常简单的问题.是的,也许不是那么重要,但我真的好奇他们的意思是什么,我找不到他们的意思.


// 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
}; 
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 30

sin_手段sockaddr_in,ai_手段addrinfo,sa_手段sockaddr.我不知道关于s_in_addr.套接字API的设计考虑了20世纪80年代早期的C编译器,它可能为所有struct成员提供了一个命名空间.


R..*_*R.. 12

larsman大多是正确的,但这不仅仅是传统的单一命名空间考虑因素.标准头文件中定义的所有结构都使用此表单的名称,以避免踩到应用程序的宏名称空间.如果结构成员没有前缀ai_,sin_等等,那么任何成员名称被包括在结构(甚至包括没有在C或POSIX标准中规定的扩展)将发生冲突,从而导致错误,如果一个应用程序中定义的相同名称的预处理器宏.通过使用可由标准中的简单模式规则(例如,netdb.hreserve ai_*)保留的这些"struct-local命名空间",保留供实现使用的名称和保留供应用程序使用的名称之间有明显的区别.标准的扩展或新修订不会导致冲突.