Что означает аббревиатура "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
};
Ответы
Ответ 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".