Я пытаюсь запрограммировать несколько сокетов, поэтому на стороне сервера я использую htonl(INADDR_ANY)
. Насколько я понял, мне кажется, что эта функция генерирует случайный IP (я прав?). Фактически, я хочу связать свой сокет с моим localhost
. Но если я запустил это
printf("%d",htonl(INADDR_ANY));
Я получаю 0 как возвращаемое значение. Может кто-нибудь дать объяснение?
htonl(INADDR_ANY)
. В документе сказано, что эта функция генерирует случайный IP ... » Это неверно. Какие документы вам об этом говорят?Ответы:
bind()
изINADDR_ANY
действительно НЕ «генерировать случайные IP». Он связывает сокет со всеми доступными интерфейсами .Для сервера обычно требуется привязка ко всем интерфейсам, а не только к «localhost».
Если вы хотите привязать свой сокет только к localhost, синтаксис будет следующим
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
: callbind(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 по программированию сокетов:
http://beej.us/guide/bgnet/
Поскольку люди все еще читают это, дополнительное примечание:
Также:
источник
INADDR_LOOPBACK
вместоinet_addr("127.0.0.1")
?INADDR_ANY
используется, когда вам не нужно привязывать сокет к определенному IP. Когда вы используете это значение в качестве адреса при вызовеbind()
, сокет принимает соединения со всеми IP-адресами машины.источник
Чтобы связать сокет с localhost , перед вызовом функции связывания необходимо правильно установить поле sin_addr.s_addr структуры sockaddr_in. Правильное значение может быть получено либо
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
или по
источник
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).источник
INADDR_ANY - это константа, значение которой равно 0. это будет использоваться только тогда, когда вы хотите подключиться со всех активных портов, которые вам не нужны, ip-add. поэтому, если вы хотите подключить какой-либо конкретный IP-адрес, вы должны указать, например, my_sockaddress.sin_addr.s_addr = inet_addr ("192.168.78.2")
источник