Что означают аббревиатуры "s_", "ai_", "sin_", "in" (если таковые имеются) в структурах IP? - PullRequest
16 голосов
/ 18 ноября 2011

Довольно простые вопросы. И да, может быть, это не так важно, но мне действительно любопытно, что они имеют в виду, и я не мог найти их значения.


// 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 ]

30 голосов
/ 18 ноября 2011

sin_ означает sockaddr_in, ai_ означает addrinfo, sa_ означает sockaddr.Я не уверен насчет s_ в in_addr.API сокетов был разработан с учетом стандартных стандартов компиляторов C начала 1980-х, которые могли бы иметь единое пространство имен для всех struct членов.

12 голосов
/ 18 ноября 2011

Ларсман в основном прав, но это не просто вопрос устаревших соображений о едином пространстве имен. Все структуры, определенные в стандартных заголовках, используют имена этой формы, чтобы не наступал на пространство имен приложения для макросов . Если члены структуры не имеют префикса ai_, sin_ и т. Д., То любые имена членов, включенные в структуру (включая расширения, даже не указанные в стандартах C или POSIX), будут конфликтовать и приводить к ошибкам, если приложение определено то же имя, что и макрос препроцессора. Используя эти "пространства имен struct-local", которые можно зарезервировать с помощью простых шаблонных правил в стандартах (например, netdb.h резервы ai_*), существует четкое различие между именами, зарезервированными для реализации, и именами, зарезервированными для использования. приложением, и новые расширения или новые редакции стандарта не приведут к конфликтам.

0 голосов
/ 17 июня 2016

Определение в Microsoft из in_addr может означать, что префикс "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» обычно означает «носок», сокращенно от «сокет», поэтомупохоже, что это причина определения.

Для любопытства на странице MSDN в разделе Поддержка IPv6 показано struct in6_addr, содержащее имя s6_addr, означающее версию IPv6 IPv4 " сокет"структура, а не просто" структура IPv4 ".

...