Подтвердить что ты не робот

Что означает аббревиатура "s_", "ai_", "sin_", "in" (если таковая) в структурах 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 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
}; 
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

определение 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".