Понимание INADDR любого для программирования сокетов
Я пытаюсь запрограммировать некоторые сокеты и поэтому, на стороне сервера, я использую htonl(INADDR_ANY)
. Насколько я понял, мне кажется, что эта функция генерирует случайный IP (я прав ?). На самом деле, я хочу связать мой сокет с моим localhost
. Но если я запустил это
printf("%d",htonl(INADDR_ANY));
Я получаю 0 в качестве возвращаемого значения. Может кто-нибудь принести какие-то объяснения ?
5 ответов:
bind () of INADDR_ANY не "генерирует случайный IP". Это привязывает сокет ко всем доступным интерфейсам.
для сервера обычно требуется привязка ко всем интерфейсам, а не только к"localhost".
если вы хотите привязать сокет только к localhost, синтаксис будет
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, тогда звонитеbind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.как это бывает," 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 ...
если вы еще не знакомы с ним, я призываю вас проверить руководство Beej по программированию сокетов:
так как люди все еще читают это, дополнительное Примечание:
когда 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-адресам устройства.
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-сопоставленные адреса).