2010-10-28 5 views
29

Ich habe Probleme, dies herauszufinden - ich arbeite mit Steckdosen in C unter Verwendung dieser Anleitung - http://binarii.com/files/papers/c_sockets.txtSockets - So finden Sie heraus, was Port und Adresse, die ich zugewiesen bin

Ich versuche, automatisch zu erhalten meine IP und Port mit:

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 

Nach einer erfolgreichen Bindung, wie finde ich heraus, welche IP-Adresse und Port ich eigentlich zugewiesen bin?

+0

Eigentlich, was passiert, wenn Sie angeben, INADDR_ANY' ist nicht, dass es die IP des Servers automatisch einfügt, was es tut, ist alle Schnittstellen findet und bindet an jede von ihnen. Daher haben Sie viele richtige Antworten auf Ihre Frage. – jer

+0

Hmm - danke jer. Eine Aufgabe, an der ich arbeite, erfordert, dass ich die IP und den Port mit dem angegebenen Code automatisch erhalte, aber ich muss die Serveradresse und den Port drucken, damit der Client sich mit dem Bildschirm verbinden kann. Das ist, was ich versuche herauszufinden, wie es geht. Wenn ich die Sockaddr-Struktur verwende, bekomme ich nur 0.0.0.0 und Port 0. – stringo0

+1

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

Antwort

60

Wenn es ein Server-Socket ist, sollten Sie listen() auf Ihrer Steckdose rufen, und dann getsockname() die Portnummer zu finden, auf dem er hört:

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

Wie für die IP-Adresse, wenn Sie INADDR_ANY verwenden dann Der Server-Socket kann Verbindungen zu beliebigen IP-Adressen des Rechners akzeptieren und der Server-Socket selbst hat keine spezifische IP-Adresse. Wenn Ihr Computer beispielsweise über zwei IP-Adressen verfügt, erhalten Sie möglicherweise zwei eingehende Verbindungen auf diesem Server-Socket mit jeweils unterschiedlichen lokalen IP-Adressen. Sie können getsockname() auf dem Socket für eine bestimmte Verbindung (die Sie von accept() erhalten) verwenden, um herauszufinden, welche lokale IP-Adresse für diese Verbindung verwendet wird.

+0

Danke mark4o - Das funktioniert super! Aber ich habe immer noch Probleme, die Adresse zu bekommen - ich bekomme immer noch 0.0.0.0 - irgendwelche Ideen? Vielen Dank! – stringo0

+1

Der Server-Socket hat keine bestimmte IP-Adresse und der Computer kann mehrere IP-Adressen haben. Wenn Sie nur eine der Adressen des Geräts erhalten möchten, sehen Sie sich diese andere Frage an: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer – mark4o

+1

Danke - gethostname hat den Trick gemacht :) – stringo0

4

Der Kommentar in Ihrem Code ist falsch. INADDR_ANY legt die IP-Adresse des Servers nicht automatisch fest. Es setzt im Wesentlichen 0.0.0.0, aus den Gründen, die in mark4o's answer erklärt werden.

+0

Macht jetzt sehr viel Sinn. Vielen Dank! – stringo0

Verwandte Themen