LINUX.ORG.RU

sin_addr vs sin_addr.s_addr

 


0

1

Перечитываю Стивенса, грепаю по исходникам 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 что-нибудь еще, и все поломается.

Это такой масштабный карго-культ или я что-то упускаю?

★★★★★

я что-то упускаю?

Это.

Но POSIX

А он-то тут при чём?

API IP-стека определяются реализацией.

inet_pton(AF_INET, «1.2.3.4», &sin.sin_addr) - валидная конструкция для IP сокетов в BSD-реализации с 1980-ых. Читай - для «обычного» интернета на всех «юниксах» и их копиях.

А позикс до in_addr_t в 2004-ом добрался, если верить гуглу.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

А он-то тут при чём?

При том:

$ man inet_pton | grep -A1 CONFORM
CONFORMING TO
       POSIX.1-2001, POSIX.1-2008.
$ uname
Linux
$ man -c inet_pton | col -bx | grep -A 3 STANDARDS
STANDARDS
     The inet_ntop and inet_pton functions conform to the IETF IPv6 BSD API
     and address formatting specifications, as well as IEEE Std 1003.1-2008
     ("POSIX.1").
$ uname
OpenBSD

API IP-стека определяются реализацией.

Но выхлоп выше свидетельствует об обратном.

inet_pton(AF_INET, «1.2.3.4», &sin.sin_addr) - валидная конструкция для IP сокетов в BSD-реализации с 1980-ых

Почему она валидная? С позиции какого из стандартов (ну или хотя бы какой реализации)?

edigaryev ★★★★★
() автор топика
Ответ на: комментарий от edigaryev

Но выхлоп выше свидетельствует об обратном

И каким же волшебным образом?

Почему она валидная?

Потому что я разраб стэка так сказал.

С позиции какого из стандартов

Ты не понял смысл моего сообщения (потому что напридумывал сам себе каких-то своих фантазий и дискутируешь с ними). Ответ на первый вопрос в этом посте будет ответом и на этот.

LamerOk ★★★★★
()

inet_pton(AF_INET, «1.2.3.4», &sin.sin_addr);

За это компилятор должен по рукам надавать.

PPP328 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.