При просмотре возвращаемого значения inet_pton и параметра inet_ntop в руководстве по PHP, это относится на in_addr в обоих случаях.

Быстрый поиск приводит меня к Центр разработки MSDN с этим ответом:

Структура in_addr представляет собой IPv4-адрес в Интернете.

Но это все еще не объясняет, что такое «структура» на самом деле. При тестировании возвращаемых значений с помощью inet_pton (используя случайный IP-адрес, например 219.225.174.153), я получаю странные символы, такие как €·Æô.

Так что же такое «структура» in_addr, о которой говорят PHP и MSDN?

php
6
doitlikejustin 7 Окт 2013 в 23:11
Я считаю, что это зависит от вашей системы, но я считаю, что это связано с in_addr C: gta.ufrj.br/ensino/eel878/sockets/sockaddr_inman.html
 – 
Julio
7 Окт 2013 в 23:15
3
Это не «странные» символы, это символы ascii, соответствующие 219, 225, 174 и 153. Помните, что квадраты с точками - это просто удобный для человека (er) метод выражения 32-битного целого числа без знака, которым на самом деле являются адреса IPv4.
 – 
Marc B
7 Окт 2013 в 23:16
Я также был разочарован документацией php.net по возвращаемому значению inet_pton(), не объясняющей или, по крайней мере, не ссылающейся на ссылку на тип данных in_addr. Я видел несколько ответов на SO, в которых говорится, что inet_pton() возвращает двоичную строку, но все еще нет ссылок на источники документации, где это объясняется.
 – 
John McMahon
23 Май 2014 в 20:33

1 ответ

Лучший ответ

inet_pton() превращает удобочитаемый IP-адрес в 4-байтовую двоичную строку, используемую для сетевых операций, обычно с использованием сырых сокетов. Эти «странные символы» представляют собой символы ASCII, представляющие числа 219, 225, 174 и 153, и их порядок байтов может быть или не может быть изменен на обратный, чтобы отразить 'endian-ness' вашей системы.

Каждый IPv4-адрес по сути представляет собой 32-битное целое число без знака, и мы создаем легкое для понимания представление этого числа, разбивая его на 4 отдельных 8-битных числа [от 0 до 255] для того, что называется «четырехзначной нотацией с точками».

dotted quad example

Я бы посоветовал посмотреть и / или использовать ip2long() и < a href = "http://php.net/manual/en/function.ip2long.php" rel = "nofollow noreferrer"> long2ip() , если вы просто ищете более эффективный хранение данных IP-адресов, а не необработанное сетевое программирование.

5
Sammitch 7 Окт 2013 в 23:28
2
Обратите внимание, что функции ip2long() и long2ip() не работают с адресами ipv6, тогда как inet_pton() и inet_ntop() могут работать как с адресами ipv4, так и с ipv6, если php был построен с поддержкой ipv6. включено.
 – 
John McMahon
23 Май 2014 в 20:22