2009-05-25 9 views
3

自分のIPアドレスを取得して、その情報をピアツーピアネットワークに公開することを検討しています。 POSIX/Cではgetaddrinfo(NULL, ...)がありますが、これは常にINADDR_ANYまたはINADDR_LOOPBACKを返すようですが、これは私には役に立たないものです。POSIX Cで独自の外部IPアドレスを取得する

提案がありますか?

答えて

4

ローカルのIPアドレスを取得しても残念なことに非常に一般的なNATのkludgeが原因で、インターネットの残りの部分で表示されるIPアドレスが異なる可能性があります。 IPv6を使用するとおそらくこの問題は抑制されますが、今はあなたにとってはオプションではないかもしれません。

公共 IPアドレスを取得するには、そのようSTUNRFC 5389)として、その目的のために作られたプロトコルが必要になります。 public STUN serversがあり、既に存在するのはSTUN clients in Cです。

すべてのピアツーピアプログラムには同様の問題がありますので、他の人たちが何をしているのかを学んでください。RFC 5128, "State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs)"を強くお勧めします。

0

UDPソケットを作成し、INADDR_ANYにbind()を実行し、インターネット上のいくつかのアドレスにconnect()してソケットのgetsockname()を使用して、割り当てられたアドレスを調べます。

もう1つの良い解決法は、ネットワークのプロトコルがそれをサポートしている場合、あなたのブートストラッピング相手に自分のIPが何であるかを尋ねることです。これにより、NATが自動的に処理されます。

+0

ためbortzmeyerの答えが好き「私はfoo.com.orgに接続したときに送信元アドレスとして使用されるIPアドレスを見つけるのですか」だろうあなたの最初の方法。 UDPソケットでは0.0.0.0(INADDR_ANY)です。 2番目の方法が考えられます。 – Nick

+0

ええと... TCPソケットを使用する必要があるかもしれませんね... – bdonlan

+0

"あなたのIPが何であると思っているかをブートストラップする相手に尋ねる"ときにいくつかのトラップがあります。ホイールの再開発やSTUNのような既存のプロトコルの使用を避ける方がよいでしょう。 – bortzmeyer

0

返品された構造のai_nextフィールドをチェックしましたか?

getaddrinfo()はリンク先のリストを返します。

+0

"しかし、これは常にINADDR_ANYまたはINADDR_LOOPBACKを返すようです。" 私はリストをトラバースしていました。そうです。 – Nick

1

公開アドレスは、あなたのアプリケーションの同僚があなたに連絡できるアドレスです。唯一の完全な方法は、既知の「外部」ピアに接続し、アドレスを送り返すことです。

+0

http://checkip.dyndns.orgは、常にあなたの現在の有効な外部IPアドレスを返します –

-1

ホストの名前がわかっている場合は、gethostbynameを使用してIPアドレスを取得できます。

+0

gethostbynameは何年も使用されなくなりました(getaddrinfoに置き換えられました)。その問題の中でも、IPv4固有です。 – bortzmeyer

1

私は、1台のコンピュータが複数のIPアドレスを持つことができますが、私はそれをもっと複雑にしようとはしていません。通常、各ネットワークカードには1つあります。依頼する

より具体的な方法は、私が試したこの:)

関連する問題