1

私はC++でのUpNPの実装に取り​​組んでおり、ソケットを機能させるには、ルーターによって割り当てられたローカル内部IPアドレスを取得する必要があります。必要なアドレスは、ルーターに接続されているコンピューターと各コンピューターに割り当てられているローカルIPを示すルーターに表示されるアドレスです。私はこれを使用しています:

PHOSTENT      Addr    = NULL;
char          Host[MAX_PATH];

if( gethostname(Host, sizeof(Host)) == 0 )
{
    Address = gethostbyname( Host );
    if( Address != NULL )
    {
        //*(struct in_addr *)Address->h_addr_list[0]) <- this is my address
    }
}

これは私がテストしているコンピューターでは正常に機能しますが、そのコンピューターにはネットワークカードが1つしかないため、コンピューターに複数のカードまたはネットワークデバイスがある場合、Address->h_addr_list[0]は私が持っているものではないのではないかと思いました。必要であり、その配列の別のインデックスにある可能性があります。

[0]は常にルーターによって割り当てられたIPを取得しますか?

4

2 に答える 2

0

(前の質問に従って、ここではwinsockを想定しています)

最初のアドレスが正しいと仮定しないでください (複数のインターフェイスが存在し、複数のインターフェイスがアクティブである可能性があるため)。

getaddrinfo空のpNodeName引数を使用してアドレスを列挙することをお勧めしますGetAdaptersAddresses

これらは両方とも、システムの登録アドレスを含むリンクされたリストを返します

于 2011-05-19T00:40:03.330 に答える
0

... ルーターによって割り当てられたローカル内部 IP アドレスを取得します ...

場合によっては、マシンの IP アドレスが手動で割り当てられますが、ユーザーは引き続き UPnP を使用したい場合があることに注意してください。

Linux では、getaddrinfo(3)代わりにを使用することをお勧めしますgethostbyname(3)。おそらく Winsocks も同様の移行を行ったのでしょうか?

Linux では、/etc/hostsホスト名からもアクセスできるループバック エントリを持つのが一般的です。/etc/gai.conf返されるアドレスの並べ替え順序を構成するために使用でき、ループバック アドレスが返される可能性があります。Winsock を使用すると、返されたアドレスの順序をシステム管理者が簡単に変更できますか?

システムには合法的に複数のアップストリーム ルーターがある可能性があることを忘れないでください。EV-DO または EDGE または同様のセルラー データ接続ワイヤレスまたは有線イーサネットを備えたラップトップには、複数の IP、複数のアップストリーム ルーターがあり、ルーティング テーブルが参照されます。各パケットを送信するためにどれを使用する必要があるかを判断します。

(a) クライアントがあなたに連絡するために使用するアドレスのいずれかを使用できますか? (getsockname(2)は、特定のソケットで使用されているローカル アドレスを返します。) (b) IP アドレスが複数ある場合は、リストから選択するようにユーザーに依頼しますか? N of M のインターフェイスにバインドすると便利です。そのため、ユーザーは、どのネットワークがサービスを受け、どのネットワークが放置されるかを選択できます。

于 2011-05-19T00:43:54.190 に答える