webentwicklung-frage-antwort-db.com.de

Sockets - Wie finde ich heraus, welchen Port und welche Adresse ich zugewiesen habe?

Ich habe Probleme, das herauszufinden - ich arbeite mit Sockets in C unter Verwendung dieses Handbuchs - http://binarii.com/files/papers/c_sockets.txt

Ich versuche, meine IP und meinen Port automatisch abzurufen, indem ich Folgendes verwende:

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

Wie finde ich nach einer erfolgreichen Bindung heraus, welche IP und welchen Port ich tatsächlich zugewiesen habe?

37
stringo0

Wenn es sich um einen Server-Socket handelt, sollten Sie listen() an Ihrem Socket aufrufen und dann getsockname() , um die Portnummer zu ermitteln, an der es hört zu:

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

Wenn Sie für die IP-Adresse INADDR_ANY Verwenden, kann der Server-Socket Verbindungen zu einer beliebigen IP-Adresse des Geräts akzeptieren, und der Server-Socket selbst hat keine bestimmte IP-Adresse. Wenn Ihr Computer beispielsweise über zwei IP-Adressen verfügt, erhalten Sie möglicherweise zwei eingehende Verbindungen über diesen Server-Socket mit jeweils einer anderen lokalen IP-Adresse. Sie können getsockname() am Socket für eine bestimmte Verbindung verwenden (die Sie von accept() erhalten), um herauszufinden, welche lokale IP-Adresse für diese Verbindung verwendet wird.

69
mark4o

Der Kommentar in Ihrem Code ist falsch. INADDR_ANY setzt die IP des Servers nicht automatisch '. Es setzt im Wesentlichen 0.0.0.0 aus den in mark4o's answer erläuterten Gründen.

5
user207421