Ist es möglich, meine externe IP-Adresse mit einer c-Funktion zu erhalten?
Dies kann ein XY problem sein. Die kurze Antwort auf Ihre Frage ist "Nein".
Die Chancen sind, wenn Sie versuchen, eine externe IP-Adresse zu erhalten, weil Sie hinter einem NAT sind und Sie einen Server ausführen möchten. Angenommen, Sie wissen, was port forwarding ist und können es auf Ihrem Nat-Box einrichten, müssen Sie Ihre externe IP-Adresse kennen, so dass Sie tatsächlich eine Verbindung zu Ihrem Server herstellen können.
Es gibt eine Reihe von öffentlichen Diensten, die Sie verwenden können, um Ihre externe IP-Adresse zu erhalten. Eine Idee ist es, kostenlos dynamic dns einzurichten. Eine andere Idee ist, Ihre externe IP von einem Dienst im Internet zu holen.
Wenn Sie eine HTTP-GET-Anforderung an http://ip-api.com/json senden, werden Sie back eine json Struktur erhalten, die Sie analysieren kann:
A successful request will return, by default, the following:
{
"status": "success",
"country": "COUNTRY",
"countryCode": "COUNTRY CODE",
"region": "REGION CODE",
"regionName": "REGION NAME",
"city": "CITY",
"zip": "ZIP CODE",
"lat": LATITUDE,
"lon": LONGITUDE,
"timezone": "TIME ZONE",
"isp": "ISP NAME",
"org": "ORGANIZATION NAME",
"as": "AS NUMBER/NAME",
"query": "IP ADDRESS USED FOR QUERY"
}
C ist nicht die beste Sprache für diese. Eine Python-Implementierung könnte sein:
import urllib2,json
j=json.load(urllib2.urlopen('http://ip-api.com/json'))
print(j['query'])
Wenn Sie wirklich Hand-Code wollen diese in C, dann nehmen Sie einen Blick auf Jerrys ausgezeichnete post auf ein kleines Programm, das Schreiben eines HTTP-Get/Post zu tun. Sie sollten auch einige der C json Parser unter json.org betrachten.
Wenn ein Gerät ist() zu einem Port abhören (mit struct sockaddr_in servaddr; servAddr.sin_addr.s_addr = htonl (INADDR_ANY);) würde die externe IP-Adresse die IP-Adresse sein() von einem anderen Gerät zu verbinden ?
Ja, wenn das andere Gerät auf der anderen Seite Ihrer Nat-Box ist und Sie Port-Weiterleitung eingerichtet haben.
Was passiert, wenn das System * mehrere * "externe IP-Adressen" hat? Viele Systeme können heute mehrere Schnittstellenkarten haben. Der einzige zuverlässige Weg besteht darin, bereits eine Verbindung herzustellen und 'getsockname' auf dem verbundenen Socket aufzurufen, um zu sehen, welche IP-Adresse der Verbindung die Verbindung verwendet. "INADDR_ANY" bedeutet auch, * alle * lokalen oder externen Schnittstellen zu hören, egal wie viele. –