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_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 llamebind(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:
También:
fuente
INADDR_LOOPBACK
, en lugar deinet_addr("127.0.0.1")
?INADDR_ANY
se 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_ANY
indica 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_INIT
su 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