2016-07-21 6 views
0

Ich habe zwei Fragen ...bekomme externe IP-Adresse durch eine c-Funktion

1.) Ist es möglich, meine externe IP-Adresse mit einer c-Funktion zu bekommen?

2.) Wenn ein Gerät() an einen Port (mit struct sockaddr_in servaddr; servAddr.sin_addr.s_addr = htonl (INADDR_ANY), ist zu hören) würde die externe IP-Adresse die IP-Adresse() zu verbinden von einem anderen Gerät?

+1

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. –

Antwort

0

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.