2013-05-12 3 views
51

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

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

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

+3

«* ... Я использую' htonl (INADDR_ANY) '. Док говорит, что эта функция генерирует случайный IP ... *« Это неверно. Какие документы вам так говорят? – alk

+0

@alk, на самом деле я вводил в заблуждение: я читал какой-то документ, который я считал официальной документацией. Я редактирую свой пост сейчас – Newben

ответ

73
  1. bind() INADDR_ANY НЕ «генерирует случайный IP». Это binds the socket to all available interfaces.

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

  3. Если вы хотите связать свой сокет только с локальным хостом, то будет синтаксис 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 к Sockets Programming:

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

+2

Это не означает «привязка ко всем интерфейсам». Если бы это так, то вывод netstat был бы иным. Это означает «слушать на * любом * интерфейсе». – EJP

+3

Чтобы процитировать ссылку выше: «Когда INADDR_ANY указан в вызове bind, сокет будет привязан ко всем локальным интерфейсам». Из другой ссылки: [Значение «INADDR_ANY» означает, что мы будем связываться с любыми/всеми IP-адресами, которые в настоящее время на локальном компьютере] (http://www.scottklement.com/rpg/socktut/bindapi.html). Но да - многие реализации будут привязываться к * первому * интерфейсу (не «все»). Но для одного ПК с одним сетевым адаптером разница является академической. С INADDR_ANY клиент может подключаться к любому/всем IP-адресам (например, 192.168.1.2 и 127.0.0.1). – paulsm4

+0

Гарантировано, будет равен 0? – 0x499602D2

45

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

+2

Единственный правильный ответ. – EJP

5

Чтобы связать гнездо с локальный, перед вами призываю связать функции, sin_addr.s_addr поле структуры sockaddr_in должны быть установлены правильно. Правильное значение может быть получено либо путем

my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1") 

или по

my_sockaddress.sin_addr.s_addr=htonl(INADDR_LOOPBACK); 
0

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

Смежные вопросы