2011-04-22 34 views
9

Aquí está el código. Es lo mismo que el código de esta pregunta similar: http://monkey.org/freebsd/archive/freebsd-stable/200401/msg00032.html. Cuando lo ejecuto siempre obtengo la salida:getsockname siempre devuelve 0.0.0.0?

escuchando en 0.0.0.0:54493 o algo así. Obviamente, el puerto cambia, pero no tengo idea de por qué sigo obteniendo una dirección IP de 0.0.0.0. ¿Me estoy perdiendo de algo?

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

int main() 
{ 
    int sock; 
    int len = sizeof(struct sockaddr); 
    struct sockaddr_in addr, foo; 

    if((sock=socket(AF_INET, SOCK_STREAM, 0))<0) 
    { 
     exit(0); 
    } 

    memset(&addr, 0, sizeof(struct sockaddr_in)); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_port = htons(0); 

    if(bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))<0) 
    { 
     perror("bind"); 
     exit(0); 
    } 

    if(listen(sock, 5)<0) 
    { 
     perror("listen"); 
     exit(0); 
    } 

    getsockname(sock, (struct sockaddr *) &foo, &len); 
    fprintf(stderr, "listening on %s:%d\n", inet_ntoa(foo.sin_addr), 
      ntohs(foo.sin_port)); 

    return 0; 
} 

Respuesta

20

Se especifica INADDR_ANY en lugar de una dirección IP específica, por lo que se une al comodín (todas las interfaces) 0.0.0.0. Entonces, cuando llamas al getsockname() eso es lo que obtienes.

Si especificó 0.0.0.0 como la dirección IP en lugar de INADDR_ANY, obtendría el mismo comportamiento; se vinculará a todas las interfaces de red en la máquina.

Por ejemplo, supongamos que solo tiene una interfaz de red con el IP 192.168.1.12 asignado. También tiene el bucle invertido por defecto - 127.0.0.1

El uso de 0.0.0.0 o INADDR_ANY significa que estará obligado a ambas direcciones, en lugar de una específica. Podrá conectarse a su proceso a través de IP.

Si tuviera que enlazar a una dirección IP específica en lugar de INADDR_ANY, su proceso solo escucharía esa IP y obtendría esa IP específica con getsockname().

+2

Entonces, ¿cómo especifica que no quiere 0.0.0.0? –

+0

Cómo enlazar el zócalo para la dirección IP específica. – Bhuvanesh

1

Sí, si lo vincula a un LOOPBACK, debe especificar INADDR_LOOPBACK. De lo contrario, se une a 0.0.0.0 que representa todas las interfaces de red disponibles. Estaba enfrentando el mismo problema, mientras emitía la llamada getnameinfo().

Cuestiones relacionadas