bind()
di INADDR_ANY
fa NOT "generare un IP casuale". Esso lega la presa di tutte le interfacce disponibili .
Per un server, in genere si desidera eseguire il binding a tutte le interfacce, non solo a "localhost".
Se desideri associare il tuo socket solo a localhost, la sintassi sarebbe my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, quindi chiama bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.
Come succede, INADDR_ANY
è una costante che sembra essere uguale a "zero":
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
...
Se non lo conosci già, ti esorto a consultare la Guida alla programmazione dei socket di Beej:
http://beej.us/guide/bgnet/
Poiché le persone stanno ancora leggendo questo, una nota aggiuntiva:
uomo (7) ip :
Quando un processo desidera ricevere nuovi pacchetti o connessioni in arrivo, deve associare un socket a un indirizzo di interfaccia locale utilizzando bind (2) .
In questo caso, solo un socket IP può essere associato a una determinata coppia locale (indirizzo, porta). Quando INADDR_ANY è specificato nella chiamata di bind, il socket verrà associato a tutte le interfacce locali.
Quando listen (2) viene chiamato su un socket non associato, il socket viene automaticamente associato a una porta libera casuale con l'indirizzo locale impostato su INADDR_ANY.
Quando connect (2) viene chiamato su un socket non associato, il socket viene automaticamente associato a una porta libera casuale oa una porta condivisa utilizzabile con l'indirizzo locale impostato su INADDR_ANY ...
Esistono diversi indirizzi speciali: INADDR_LOOPBACK (127.0.0.1) si riferisce sempre all'host locale tramite il dispositivo di loopback; INADDR_ANY (0.0.0.0) indica qualsiasi indirizzo per l'associazione ...
Anche:
bind () - Associa un nome a un socket :
Se il campo (sin_addr.s_addr) è impostato sulla costante INADDR_ANY, come definito in netinet / in.h, il chiamante richiede che il socket sia associato a tutte le interfacce di rete sull'host. Successivamente, i pacchetti UDP e le connessioni TCP da tutte le interfacce (che corrispondono al nome associato) vengono instradati all'applicazione. Ciò diventa importante quando un server offre un servizio a più reti. Lasciando l'indirizzo non specificato, il server può accettare tutti i pacchetti UDP e le richieste di connessione TCP effettuate per la sua porta, indipendentemente dall'interfaccia di rete su cui sono arrivate le richieste.
htonl(INADDR_ANY)
. Il documento dice che questa funzione genera un IP casuale ... " Questo non è corretto. Quale documento te lo dice?