Estoy tratando de programar algunos sockets y, por lo tanto, en el lado del servidor, utilizo htonl(INADDR_ANY). En la medida que entendí, me parece que esta función genera una IP aleatoria (¿estoy en lo cierto?). De hecho, quiero vincular mi enchufe con mi localhost. Pero si ejecuto esto
printf("%d",htonl(INADDR_ANY));
Obtengo 0 como valor de retorno. ¿Alguien podría traer alguna explicación?

htonl(INADDR_ANY). El documento dice que esta función genera una IP aleatoria ... " Esto no es correcto. ¿Qué documentos te lo dicen?Respuestas:
bind()deINADDR_ANYqué 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 llamebind(my_socket, (SOCKADDR *) &my_sockaddr, ...).Da la casualidad de que
INADDR_ANYes 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:
También:
fuente
INADDR_LOOPBACK, en lugar deinet_addr("127.0.0.1")?INADDR_ANYse utiliza cuando no es necesario vincular un socket a una IP específica. Cuando usa este valor como la dirección al llamarbind(), el socket acepta conexiones a todas las IP de la máquina.fuente
Para unen zócalo con localhost , antes de invocar el aprieto función, sin_addr.s_addr campo de la estructura sockaddr_in debe ajustarse adecuadamente. El valor adecuado puede obtenerse mediante
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")o por
fuente
INADDR_ANYindica al socket de escucha que se vincule a todas las interfaces disponibles. Es lo mismo que intentar enlazarinet_addr("0.0.0.0"). Para completar, también mencionaré que también hay IN6ADDR_ANY_INIT para IPv6 y es lo mismo que intentar enlazar a la::dirección para el socket IPv6.#include <netinet/in.h> struct in6_addr addr = IN6ADDR_ANY_INIT;Además, tenga en cuenta que cuando vincula el socket IPv6 a
IN6ADDR_ANY_INITsu socket, se vinculará a todas las interfaces IPv6, y también debería poder aceptar conexiones de clientes IPv4 (a través de direcciones asignadas IPv6).fuente
INADDR_ANY es una constante, que contiene 0 en valor. esto se usará solo cuando desee conectarse desde todos los puertos activos que no le interesan ip-add. así que si desea conectar cualquier IP en particular, debe mencionar como my_sockaddress.sin_addr.s_addr = inet_addr ("192.168.78.2")
fuente