2011-01-11 7 views
2

私はピアがプライベートIPとパブリックIPに情報を伝えるためにサーバーと話すP2Pアプリケーションを開発しています。アプリケーションは通信にUDPを使用します。P2PアプリケーションでのローカルIPアドレスの決定

プライベートIPを取得するには、クライアントはgethostbynameを使用して、そのIPにバインドします。問題は、システムに複数のNICがある場合です。問題は、NICの1つがインターネットに接続されていない場合です。だから私はそれを避けるためにINADDR_ANYを使用しています。

これでサーバに通知するために自分のローカルIPアドレスを取得する必要があります。 NICのどのIPアドレスがアクティブであるかを教えてくれるAPIはありますか?

答えて

1

あなたはINADDR_ANYへの結合がローカルアドレスを取得するために、ソケット上getsockname()を呼び出すと、単にINADDR_ANYを返すことを意味しますとしてではなくINADDR_ANYより明示的なIPアドレスにバインドする必要があります。

したがって、使用可能なエンドポイントを反復して(getaddrinfo()を使用)、それぞれにソケットを作成する必要があります。後でgetsockname()を呼び出すと、正しい住所が表示されます。

+0

特定のIPを使用してバインドすることはできません。なぜなら、どのIPがアクティブかわからないからです。それで、私はINADDR_ANYを使ってバインドするので、到着したパケットは適切に配信されます。 – Jeeva

+1

だからこそ、私はあなたがすべてのインターフェースを繰り返し、それぞれにバインドすることをお勧めします。追加される新しいインターフェースなども処理したい場合は、インターフェースの変更もリッスンする必要があります。 'INADDR_ANY'にバインドすると' getsockname() 'は常にソケットがバインドされているものと同じように' INADDR_ANY'を返します。 –

+0

私はすべてのアドレスにバインドする場合データを送信するために使用しているIPをどのように決定するのですか?サーバーにクライアントのプライベートIPを決定する方法はありません – Jeeva

関連する問題