Wie man seine eigene IP-Adresse mit einer socket-Adresse?
Möchte ich, um die IP-Adresse des Computers, mein Programm gestartet wird, fähig zu sein, dann senden Sie es an einen client, aber ich bekomme immer 0.0.0.1 statt der realen IP-Adresse (wie 127.0.0.1 zum Beispiel).
Ich bin derzeit in der Lage, um den port, nicht aber die IP-Adresse.
Wie ich es bekommen kann?
Die beste Lösung wäre, um der Lage sein, um es mit einem sockaddr_in
. Hier ist, was ich bin derzeit dabei:
int open_connection(char* ip, int* port)
{
int sock;
struct sockaddr_in sin;
socklen_t len;
int i;
i = 0;
len = sizeof(sin);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return (-1);
bzero(&sin, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) != 0)
perror("Error on bind");
if (getsockname(sock, (struct sockaddr *)&sin, &len) != 0)
perror("Error on getsockname");
strcpy(ip, inet_ntoa(sin.sin_addr)); //IP = 0.0.0.0
*port = sin.sin_port;
return (sock);
}
EDIT: ich verstehen, ich war das gehen auf dem falschen Weg mit meiner Art zu denken. Also meine Frage ist: Was ist der beste Weg, um Ihre eigene IP-Adresse?
- Wenn der client, mit dir zu reden... er hat schon Ihre ip-Adresse. Ich bin verwirrt, warum Sie benötigen, senden Sie es explizit.
- Ich mache einen FTP-server und bei der Eingabe der passive Modus, muss ich zum senden der IP-Adresse und der port über den der server läuft... Auch wenn es die gleiche IP-Adresse...
- Vielleicht diese alte Frage? stackoverflow.com/questions/212528/... ich denke, bind to 0.0.0.0 ist eine spezielle Sache, obwohl, was bedeutet, dass das binden an alle IP - Adressen- ich bezweifle, Sie würden sich etwas anderes aus binden, denn das ist, was Sie übergeben.
- Tatsächlich können Sie immer noch verwenden
getsockname()
aber rufen Sie es auf die Buchse für die Verbindung mit dem client, nicht der sockel für die Bindung. Das wird Ihnen zeigen, welche Ihrer Schnittstellen, die client spricht, was ich davon ausgehen, werden die gleichen sein, Sie müssen verwenden Sie für die Hilfs-Daten-Verbindung. - Ok, und dann bekommen Sie die ip-Adresse für diese Schnittstelle mit
ioctl
? Kannst du es als Antwort, damit ich überprüfen kann? Danke. - Als ähnliche Frage hier: stackoverflow.com/q/10956890/694576
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
bind()
einen socket auf 0.0.0.0, das ist die einzige IP die Steckdose zur Verfügung hat, die beim aufrufengetsockname()
. Es bedeutet, dass der socket gebunden ist an allen lokalen Schnittstellen. Um eine bestimmte IP aus der Steckdose, hat es sich als gebunden an eine bestimmte IP.Mithilfe der socket-API, um die Maschine die lokale IP(s) ist der falsche Ansatz sowieso. Ein häufiger Fehler ist die Verwendung
gethostname()
mitgethostbyname()
odergetaddrinfo()
um die lokale IP-Liste. In der Regel funktioniert, aber es hat einige versteckte fallen, können zu falschen Informationen, aber die Menschen neigen dazu, diese Tatsache zu ignorieren, oder gar nicht kennen, es in den ersten Platz (ich wusste nicht, über es für mehrere Jahre, aber dann habe ich gelernt, besser).Statt, die Sie wirklich verwenden sollten, Plattform-spezifische APIs für das auflisten der lokalen Netzwerk-Schnittstellen. Das wird mehr zuverlässige Informationen. Windows hat
GetAdaptersInfo()
undGetAdaptersAddresses()
. Andere Plattformen habengetifaddrs()
. Diese wird Ihnen sagen, welche lokalen IPs verfügbar sind. Sie können dannbind()
einen socket auf 0.0.0.0 um zu akzeptieren, Kunden auf die IPs, oderbind()
zu einer bestimmten IP zu akzeptieren, Kunden nur über die IP.getaddrinfo()
bitte?gethostbyname()
undgetaddrinfo()
sind entworfen, um die Verwendung von DNS-lookups zum auflösen von Hostnamen zu IP-Adressen. Sie sind nicht gedacht, um abrufen von Informationen über localhost. Es ist möglich für a) einen Benutzer zu ändern/beschädigt das Betriebssystem die DNS-cache (hosts-Datei, etc), und b) einen PC der hostname konfiguriert werden, um nicht eine IP oder zuordnen zu mehreren IPs, die möglicherweise nicht alle gehören zu der PC (denke, load balancing, etc). Sind diese Funktionen nicht zu 100% garantiert zurückgeben gültigen lokalen IPs bei übergabe einer lokalen Hostnamen in allen setups. Funktionen wieGetAdaptersInfo()
undgetifsaddrs()
sind speziell für diesen Zweck statt.getifaddrs()
), und es ist einfach zu implementieren, Dank !gethostbyname()
undgetaddrinfo()
auf Windows gelten die gleichen Fallstricke, die ich früher erwähnt. Nur weil Sie in der Regel nicht sehen, Sie passieren nicht, dass Sie nicht passieren (und die ich gesehen habe Berichte von Ihnen geschieht, auch auf Windows). Die richtig Weg, um die lokalen IPs auf Windows ist die VerwendungGetAdaptersInfo()
oderGetAdaptersAddresses()
.gethostbyname()
. Auf bestimmten Netzwerken, der Anruf war eine sehr lange Zeit (~30s) nur um die lokale IP-Adresse. Wie es scheint, eines Ihrer "Fallstricke". Änderung Ihrer internen code zu verwendengetifaddrs()
stattdessen erschien um das problem zu beheben. Vielen Dank so viel für dieses posting eine Antwort!Dem sockets-API können Sie aufzählen, die zugewiesenen IP-Adressen an Ihre Netzwerk-Schnittstellen, aber es wird Ihnen nicht sagen, was du "real-IP" ist, wenn Sie eine Verbindung zum Internet hinter einem router.
Der einzige Weg zu wissen, es ist, indem er jemanden von außerhalb. Das ist, wie Server FileZilla FTP-Server tun. Sie unterweisen die Ihnen das konfigurieren der URL ein "ip.php" Schrift, wie diese eine in den server-Einstellungen kann es also Fragen Sie das Internet, was seine öffentliche IP-Adresse, zu verwenden, in den Passiven Modus.
Können Sie auch erwägen, STUN ein Protokoll ist weit verbreitet in VoIP zu entdecken, öffentliche IP-Adresse.
Könnten Sie call ioctl(sock, SIOCGIFADDR, adr)
sehen netdevice(7)
Folgenden
@Remy Lebeau
's Antwort, schrieb ich eine Funktion, die wieder Strom Rechner die Adresse. Ich habe nur getestet auf macOS High Sierra.interfaec
kann alles sein, was unterlo0
,en0
usw.ipVersion
werden kannAF_INET
oderAF_INET6
.Um es zu verwenden,
Ich bin noch ein Anfänger in C, wenn es etwas falsch bitte sagen Sie mir.