Tengo problemas para resolver esto. Estoy trabajando con sockets en C usando esta guía. http://binarii.com/files/papers/c_sockets.txt
Estoy tratando de obtener automáticamente mi ip y puerto usando:
server.sin_port = 0; /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY; /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function
Después de un enlace exitoso, ¿cómo averiguo qué IP y puerto tengo realmente asignado?
Si es un socket de servidor, debe llamar listen()
en su enchufe, y luego getsockname()
para encontrar el número de puerto en el que está escuchando:
struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
perror("getsockname");
else
printf("port number %d\n", ntohs(sin.sin_port));
En cuanto a la dirección IP, si usa INADDR_ANY
entonces el socket del servidor puede aceptar conexiones a cualquiera de las direcciones IP de la máquina y el socket del servidor en sí no tiene una dirección IP específica. Por ejemplo, si su máquina tiene dos direcciones IP, es posible que obtenga dos conexiones entrantes en este servidor, cada una con una dirección IP local diferente. Puedes usar getsockname()
en el zócalo para una conexión específica (que se obtiene de accept()
) para averiguar qué dirección IP local se está utilizando en esa conexión.
El comentario en tu código es incorrecto. INADDR_ANY
no pone la IP del servidor automáticamente’. Esencialmente pone 0.0.0.0por las razones explicadas en la respuesta de mark4o.
En realidad, lo que sucede cuando especificas
INADDR_ANY
no es que ponga la IP del servidor automáticamente, lo que hace es encontrar todas las interfaces, y enlazar con cada una de ellas. Por lo tanto, tiene muchas respuestas correctas a su pregunta.– jer
28/10/2010 a las 19:50
Hmm – gracias jer. Una tarea en la que estoy trabajando requiere que obtenga automáticamente la IP y el puerto usando el código especificado, pero debo imprimir la dirección del servidor y el puerto para que el cliente se conecte en la pantalla. Esto es lo que estoy tratando de averiguar cómo hacer. Si uso la estructura sockaddr, solo obtengo 0.0.0.0 y el puerto 0.
– stringo0
28/10/2010 a las 19:52
Ver stackoverflow.com/questions/2496302/…
– marca4o
28/10/2010 a las 19:55
En realidad, no ‘se une a cada uno de ellos’. no se une a ninguna de ellos. Más bien le dice a la pila que actuar como si estaba obligado a todos de ellos. Por eso se llama INADDR_ANY.
– usuario207421
29 de octubre de 2010 a las 11:35