Sockets: cómo saber qué puerto y dirección tengo asignados

3 minutos de lectura

Sockets como saber que puerto y direccion tengo asignados
stringo0

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?

  • 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


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.

  • Gracias mark4o – ¡Eso funciona muy bien! Pero sigo teniendo problemas para obtener la dirección. Sigo recibiendo 0.0.0.0. ¿Alguna idea? ¡Gracias!

    – stringo0

    28 de octubre de 2010 a las 23:41


  • El socket del servidor no tiene una dirección IP específica y la máquina puede tener varias direcciones IP. Si solo desea obtener una de las direcciones de la máquina, consulte esta otra pregunta: stackoverflow.com/questions/212528/…

    – marca4o

    28/10/2010 a las 23:53

  • Gracias por este ejemplo de código. Si alguien está confundido acerca de qué es sock, es el descriptor de archivo del socket.

    – Justin Danielson

    28 de noviembre de 2012 a las 17:42

  • ¿Qué pasa con UDP? Si envío en un socket que tiene puerto 0 asignado, ¿cómo puedo averiguar cuál es realmente el número de puerto de envío? (Es diferente de TCP)

    – U. Windl

    11 de julio de 2018 a las 7:26

  • Tenga en cuenta que en realidad no tiene que llamar listenesto debería funcionar tanto para los sockets TCP como para los UDP siempre que estén vinculados primero.

    – Andrés Sol

    11 de julio de 2018 a las 7:53

1647561366 793 Sockets como saber que puerto y direccion tengo asignados
usuario207421

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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad