Понимание INADDR любого для программирования сокетов


Я пытаюсь запрограммировать некоторые сокеты и поэтому, на стороне сервера, я использую htonl(INADDR_ANY). Насколько я понял, мне кажется, что эта функция генерирует случайный IP (я прав ?). На самом деле, я хочу связать мой сокет с моим localhost. Но если я запустил это

printf("%d",htonl(INADDR_ANY));

Я получаю 0 в качестве возвращаемого значения. Может кто-нибудь принести какие-то объяснения ?

5 61

5 ответов:

  1. bind () of INADDR_ANY не "генерирует случайный IP". Это привязывает сокет ко всем доступным интерфейсам.

  2. для сервера обычно требуется привязка ко всем интерфейсам, а не только к"localhost".

  3. если вы хотите привязать сокет только к localhost, синтаксис будет my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");, тогда звоните bind(my_socket, (SOCKADDR *) &my_sockaddr, ...).

  4. как это бывает," INADDR_ANY " - это константа, которая бывает равна "ноль":

    http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html

    # define INADDR_ANY ((unsigned long int) 0x00000000)
    ...
    # define INADDR_NONE    0xffffffff
    ...
    # define INPORT_ANY 0
    ...
    
  5. если вы еще не знакомы с ним, я призываю вас проверить руководство Beej по программированию сокетов:

    http://beej.us/guide/bgnet/

так как люди все еще читают это, дополнительное Примечание:

man (7) ip:

когда a процесс хочет получать новые входящие пакеты или соединения, он должен привязать сокет к локальному интерфейсному адресу с помощью bind (2).

в этом случае только один IP-сокет может быть привязан к любому заданному локальному (адрес, порт) пара. Когда INADDR_ANY указан в вызове привязки, сокет будет привязан ко всем локальным интерфейсам.

, когда слушать(2) вызывается на несвязанном сокете, сокет автоматически привязывается к случайному свободному порт с локальным набором адресов к INADDR_ANY.

, когда connect (2) вызывается на несвязанном сокете, сокет автоматическая привязка к произвольному Свободному порту или к используемому общему порту с локальным адресом, установленным в INADDR_ANY...

есть несколько специальных адресов: INADDR_LOOPBACK (127.0.0.1) всегда ссылается на локальный хост через устройство обратной связи; INADDR_ANY (0.0.0.0) означает любой адрес обязательный...

также:

bind () - привязать имя к a сокет:

если (sin_addr.s_addr) поле имеет значение константа INADDR_ANY, как определяется в netinet/in.h, вызывающий абонент запрашивает, чтобы сокет был привязан ко всем сетевым интерфейсам на хосте. Впоследствии, UDP пакеты и TCP-соединения со всех интерфейсов (которые соответствуют связанному имени) направляются в приложение. Это становится важно, когда сервер предлагает услугу для нескольких сетей. Оставив адрес не указано, что сервер может принимать все UDP-пакеты и TCP-соединение запросы на порт, независимо от сетевого интерфейса какие запросы поступили.

INADDR_ANY используется, когда вам не нужно привязывать сокет к определенному IP. При использовании этого значения в качестве адреса при вызове bind(), сокет принимает подключения ко всем IP-адресам устройства.

до связать розетка с localhost, прежде чем вы вызовете связать

INADDR_ANY-это константа, которая содержит 0 в значении . это будет использоваться только тогда, когда вы хотите подключиться со всех активных портов вы не заботитесь о ip-add . поэтому, если вы хотите подключить какой-либо конкретный ip, вы должны упомянуть, как my_sockaddress.sin_addr.s_addr = inet_addr ("192.168.78.2")

INADDR_ANY указывает прослушивающему сокету на привязку ко всем доступным интерфейсам. Это то же самое, что пытаться привязать к inet_addr("0.0.0.0"). Для полноты я также упомяну, что есть также IN6ADDR_ANY_INIT для IPv6 и это то же самое, что пытаться привязать к :: адрес для сокета IPv6.

#include <netinet/in.h>

struct in6_addr addr = IN6ADDR_ANY_INIT;

кроме того, обратите внимание, что при привязке сокета IPv6 к IN6ADDR_ANY_INIT ваш сокет будет привязан ко всем интерфейсам IPv6, и должен быть в состоянии принимать соединения от клиентов IPv4, а также (хотя IPv6-сопоставленные адреса).