Перечитываю Стивенса, грепаю по исходникам OpenBSD, примерам в интернете и везде вижу примерно следующий код:
struct sockaddr_in sin;
inet_pton(AF_INET, "1.2.3.4", &sin.sin_addr);
...вместо:
struct sockaddr_in sin;
inet_pton(AF_INET, "1.2.3.4", &sin.sin_addr.s_addr);
Да, стандарт ставит знак равно между указателем на структуру и указателем на первый её объект:
A pointer to a structure object, suitably converted, points to its initial member [...]
(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, §6.7.2.1, p. 13)
Но POSIX при этом предъявляет лишь одно требование касательно структуры in_addr
(в которой лежит s_addr
):
The <netinet/in.h> header shall define the in_addr structure, which shall include at least the following member:
in_addr_t s_addr
(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html)
А это значит что запиливатели ОС могут вполне себе засунуть в структуру in_addr
перед s_addr
что-нибудь еще, и все поломается.
Это такой масштабный карго-культ или я что-то упускаю?