bind()
de INADDR_ANY
qué NO "generar una IP aleatoria". Se une a la toma de todas las interfaces disponibles .
Para un servidor, normalmente desea vincularse a todas las interfaces, no solo a "localhost".
Si desea vincular su socket solo a localhost, la sintaxis sería my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, luego llame bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.
Da la casualidad de que INADDR_ANY
es una constante que resulta ser igual a "cero":
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
...
Si aún no está familiarizado con él, le recomiendo que consulte la Guía de programación de sockets de Beej:
http://beej.us/guide/bgnet/
Dado que la gente todavía está leyendo esto, una nota adicional:
hombre (7) ip :
Cuando un proceso desea recibir nuevos paquetes o conexiones entrantes, debe vincular un socket a una dirección de interfaz local usando bind (2) .
En este caso, solo un socket IP puede estar vinculado a cualquier par local (dirección, puerto) dado. Cuando se especifica INADDR_ANY en la llamada de vinculación, el socket se vinculará a todas las interfaces locales.
Cuando se llama a listen (2) en un socket no vinculado, el socket se vincula automáticamente a un puerto libre aleatorio con la dirección local establecida en INADDR_ANY.
Cuando se llama a connect (2) en un socket no vinculado, el socket se vincula automáticamente a un puerto libre aleatorio oa un puerto compartido utilizable con la dirección local establecida en INADDR_ANY ...
Hay varias direcciones especiales: INADDR_LOOPBACK (127.0.0.1) siempre se refiere al host local a través del dispositivo de loopback; INADDR_ANY (0.0.0.0) significa cualquier dirección para vincular ...
También:
bind () - Vincula un nombre a un socket :
Si el campo (sin_addr.s_addr) se establece en la constante INADDR_ANY, como se define en netinet / in.h, la persona que llama solicita que el conector esté vinculado a todas las interfaces de red en el host. Posteriormente, los paquetes UDP y las conexiones TCP de todas las interfaces (que coinciden con el nombre vinculado) se enrutan a la aplicación. Esto se vuelve importante cuando un servidor ofrece un servicio a múltiples redes. Al dejar la dirección sin especificar, el servidor puede aceptar todos los paquetes UDP y las solicitudes de conexión TCP realizadas para su puerto, independientemente de la interfaz de red a la que llegaron las solicitudes.
htonl(INADDR_ANY)
. El documento dice que esta función genera una IP aleatoria ... " Esto no es correcto. ¿Qué documentos te lo dicen?