2016-07-21 6 views
0

私は2つの質問があります...cの関数で外部IPアドレスを取得

1.)私の外部IPアドレスをc関数で取得することは可能ですか?

2)デバイスは、(構造体のsockaddr_in servAddr付きポート(に); servAddr.sin_addr.s_addr = htonl(INADDR_ANY)聴く場合) 外部IPアドレスがIPアドレスを接続することであろう()別のデバイスからですか?

+1

システムに複数の「外部IPアドレス」がある場合はどうなりますか?今日の多くのシステムは、複数のインターフェースカードを持つことができます。唯一の信頼できる方法は、既に接続を確立し、接続しているソケット上で 'getsockname'を呼び出して、接続がどのインタフェースIPアドレスを使用しているかを確認することです。また、 'INADDR_ANY'は、どれくらいの数であっても、ローカルまたは外部のすべてのインタフェースをlistenすることを意味します。 –

答えて

0

私の外部IPアドレスをc関数で取得することはできますか?

これはXY problemです。あなたの質問への短い答えは、 "いいえ"です。

外部IPアドレスを取得しようとしているのは、NATの背後にあり、サーバーを実行したいからです。 port forwardingが何であるかを知っていて、NATボックスに設定できるとすれば、実際にサーバーに接続できるように外部IPアドレスを知る必要があります。

外部IPアドレスを取得するために使用できる公共サービスはいくつかあります。 1つのアイデアは、フリーdynamic dnsを設定することです。別の考え方は、インターネット上のサービスから外部IPを取得することです。

あなたはHTTPを送信する場合http://ip-api.com/jsonにリクエストを取得するには、あなたが解析できるback JSON構造を得ることができます:

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は、このための最良の言語ではありません。 Pythonの実装は次のようになります。

import urllib2,json 
j=json.load(urllib2.urlopen('http://ip-api.com/json')) 
print(j['query']) 

あなたは本当にCで手コードこの場合、HTTP GET /ポストを行うための小さなプログラムを書くことにジェリーの優れたpostを見てみたい場合。また、json.orgのC jsonパーサのいくつかを見たいと思うでしょう。

デバイスがポートに)(聞く場合(構造体のsockaddr_in servAddrと; servAddr.sin_addr.s_addr = htonl(INADDR_ANY))外部IPアドレス(接続先のIPアドレスである)別のデバイスから?

はい、他のデバイスがナットボックスの反対側にあり、ポート転送をセットアップしている場合はあります。

関連する問題