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

时间:2011-11-18 10:22:54

标签: c linux sockets network-programming ip

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


// 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
}; 

3 个答案:

答案 0 :(得分:30)

sin_表示sockaddr_inai_表示addrinfosa_表示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结构”。