2010-10-28 14 views
29

Sto avendo difficoltà a capire questo fuori - sto lavorando con prese in C usando questa guida - http://binarii.com/files/papers/c_sockets.txtSockets - Come scoprire cosa porta e l'indirizzo sto assegnati

Sto cercando di ottenere automaticamente il mio IP e la porta utilizzando:

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 

Dopo un vicolo cieco di successo, come faccio a sapere quale IP e Port realtà sono assegnati?

+0

In realtà ciò che accade quando si specifica 'INADDR_ANY' non è che inserisce automaticamente l'IP del server, ciò che fa è trovare tutte le interfacce e si lega a ciascuna di esse. Pertanto, hai molte risposte giuste alla tua domanda. – jer

+0

Hmm - grazie jer. Un incarico su cui sto lavorando mi richiede di ottenere automaticamente l'IP e la porta usando il codice specificato, ma devo stampare l'indirizzo del server e la porta per il client a cui connettersi sullo schermo. Questo è quello che sto cercando di capire come fare. Se utilizzo la struttura sockaddr, ottengo solo 0.0.0.0 e la porta 0. – stringo0

+1

Vedere http://stackoverflow.com/questions/2496302/how-can-i-obtain-the-local-tcp-port-and-ip -address-of-my-client-program – mark4o

risposta

60

Se si tratta di un socket server, è necessario chiamare listen() sulla vostra presa, e poi getsockname() per trovare il numero di porta su cui è in ascolto:

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)); 

Per quanto riguarda l'indirizzo IP, se si utilizza INADDR_ANY poi il socket del server può accettare connessioni a qualsiasi indirizzo IP della macchina e il socket del server stesso non ha un indirizzo IP specifico. Ad esempio, se la tua macchina ha due indirizzi IP, potresti avere due connessioni in entrata su questo socket del server, ognuna con un indirizzo IP locale diverso. È possibile utilizzare getsockname() sul socket per una connessione specifica (che si ottiene da accept()) per scoprire quale indirizzo IP locale viene utilizzato su quella connessione.

+0

Grazie mark4o - Funziona benissimo! Ma ho ancora problemi a ottenere l'indirizzo - ottengo ancora 0.0.0.0 - qualche idea? Grazie! – stringo0

+1

Il socket del server non ha un indirizzo IP specifico e la macchina potrebbe avere più indirizzi IP. Se vuoi solo ottenere uno degli indirizzi della macchina, dai un'occhiata a questa altra domanda: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer – mark4o

+1

Grazie - gethostname ha fatto il trucco :) – stringo0

4

Il commento nel tuo codice è errato. INADDR_ANY non inserisce automaticamente l'IP del server '. In sostanza mette 0.0.0.0, per i motivi spiegati in answer di mark4o.

+0

Ora ha molto senso. Grazie! – stringo0

Problemi correlati