bind()
od INADDR_ANY
robi NIE „wygenerować losowy IP”. To wiąże się gniazdo do wszystkich dostępnych interfejsów .
W przypadku serwera zazwyczaj chcesz powiązać wszystkie interfejsy - nie tylko „localhost”.
Jeśli chcesz powiązać swoje gniazdo tylko z lokalnym hostem, składnia byłaby następująca my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, a następnie call bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.
Tak się składa, że INADDR_ANY
jest stałą równą zeru:
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
...
Jeśli jeszcze go nie znasz, zachęcam do zapoznania się z przewodnikiem Beej po programowaniu gniazd:
http://beej.us/guide/bgnet/
Ponieważ ludzie nadal to czytają, dodatkowa uwaga:
man (7) ip :
Gdy proces chce otrzymywać nowe przychodzące pakiety lub połączenia, powinien powiązać gniazdo z adresem interfejsu lokalnego za pomocą funkcji bind (2) .
W takim przypadku tylko jedno gniazdo IP może być powiązane z dowolną parą lokalną (adres, port). Gdy INADDR_ANY zostanie podana w wywołaniu wiązania, gniazdo zostanie powiązane ze wszystkimi lokalnymi interfejsami.
Kiedy nasłuchiwanie (2) jest wywoływane na niezwiązanym gnieździe, gniazdo jest automatycznie wiązane z losowym wolnym portem z adresem lokalnym ustawionym na INADDR_ANY.
Gdy connect (2) jest wywoływany na niezwiązanym gnieździe, gniazdo jest automatycznie przypisywane do losowego wolnego portu lub do użytecznego portu współdzielonego z adresem lokalnym ustawionym na INADDR_ANY ...
Istnieje kilka adresów specjalnych: INADDR_LOOPBACK (127.0.0.1) zawsze odwołuje się do lokalnego hosta za pośrednictwem urządzenia zwrotnego; INADDR_ANY (0.0.0.0) oznacza dowolny adres do powiązania ...
Również:
bind () - Powiąż nazwę z gniazdem :
Jeśli pole (sin_addr.s_addr) jest ustawione na stałą INADDR_ANY, zgodnie z definicją w netinet / in.h, wywołujący żąda powiązania gniazda ze wszystkimi interfejsami sieciowymi na hoście. Następnie pakiety UDP i połączenia TCP ze wszystkich interfejsów (które pasują do powiązanej nazwy) są kierowane do aplikacji. Jest to ważne, gdy serwer oferuje usługę w wielu sieciach. Pozostawiając nieokreślony adres, serwer może akceptować wszystkie pakiety UDP i żądania połączeń TCP wysyłane do jego portu, niezależnie od interfejsu sieciowego, do którego przyszły żądania.
htonl(INADDR_ANY)
. Dokument mówi, że ta funkcja generuje losowe IP… ” To nie jest poprawne. Które dokumenty ci to mówią?