その情報をピアツーピア ネットワークに公開するために、自分の IP アドレスを取得しようとしています。POSIX/C ではがありますが、これは常にorgetaddrinfo(NULL, ...)
を返すようで、私には役に立ちません。INADDR_ANY
INADDR_LOOPBACK
助言がありますか?
その情報をピアツーピア ネットワークに公開するために、自分の IP アドレスを取得しようとしています。POSIX/C ではがありますが、これは常にorgetaddrinfo(NULL, ...)
を返すようで、私には役に立ちません。INADDR_ANY
INADDR_LOOPBACK
助言がありますか?
問題の1つは、ローカルIPアドレスを取得しても、残念ながら非常に一般的なNATの問題のために、インターネットの他の部分で見られるIPアドレスが異なる場合があることです。IPv6を使用すると、おそらくこの問題は抑制されますが、現時点ではオプションではない可能性があります。
パブリックIPアドレスを取得するには、 STUN(RFC 5389 )などのその目的のために作成されたプロトコルが必要になります。CにはパブリックSTUNサーバーと既存のSTUNクライアントがあります。
すべてのピアツーピアプログラムには同様の問題があるため、他の人が何をしているのかを学びましょう。RFC5128「ネットワークアドレストランスレータ(NAT)間のピアツーピア(P2P)通信の状態」を読むことを強くお勧めします。
I'm not trying to make things more complicated though I should point out that a single computer can have several IP addresses. typically each network card will have one.
a more specific way to ask would be "how do I find the IP address that will be used as the source address when I connect to foo.com.org" I like bortzmeyer's answer for this :)
UDP ソケットを作成し、bind() を INADDR_ANY に接続し、connect() をインターネット上のアドレスに接続してから、ソケットで getsockname() を使用して、割り当てられたアドレスを調べます。
ネットワークのプロトコルがそれをサポートしている場合、別の良い解決策は、ブートストラップピアにあなたの IP が何であるかを尋ねることです。これにより、NAT が自動的に処理されます。
ホストの名前がわかっている場合は、gethostbyname を使用して IP アドレスを取得できます。