2

C ++でデフォルトのWindowsゲートウェイのIPアドレスを読み取る方法を誰かが教えてくれますか。GetAdaptersInfo() を使用してすべての IP アドレスのリストを読み取ることはできますが、デフォルト ゲートウェイの IP アドレスを読み取ることはできません。

   GetAdaptersInfo( pAdapterInfo, &BufferLength );
 // Iterate the network adapters and print their MAC address.
    while( pAdapterInfo )
    {           
        pAdapterInfo = pAdapterInfo->Next; // Get next adapter info
    }

これがコード スニペットで、どのフィールドがデフォルト ゲートウェイを提供するのか疑問に思っています。リスト内のすべての IP アドレスのゲートウェイを取得できますが、デフォルト ゲートウェイの IP アドレスが必要です。

これが必要な元の理由は、デフォルト ゲートウェイを取得した IP の特定の MAC アドレスを (多数の MAC アドレスから) 選択することでした。リストを繰り返し処理している間に複数の MAC アドレスを取得するため、デフォルト ゲートウェイを持つ IP の MAC アドレスを取得するのが最善の方法であると考えました。その後気が変わったので、有線接続の MAC アドレスを選択します。しかし、すべてのアダプターを反復処理するのではなく、デフォルト ゲートウェイを取得する方法を知りたいと思っています。

4

4 に答える 4

3

GetAdaptersInfoあなたにこれを与えます:

ゲートウェイ リスト

タイプ: IP_ADDR_STRING

IP_ADDR_STRING 構造体のリンク リストとして表される、このアダプターのゲートウェイの IPv4 アドレス。アダプターには、複数の IPv4 ゲートウェイ アドレスを割り当てることができます。通常、このリストには、このアダプタのデフォルト ゲートウェイのIPv4 アドレスのエントリが 1 つ含まれます。

GetAdaptersInfo既に持っているデータからゲートウェイを取得できない場合は、コードを投稿する必要があるかもしれません。

ipconfig /all基本的に、コマンドプロンプトから実行することで、この情報を「プレビュー」できます。ゲートウェイがインターフェイスごとに定義されていることがわかります。グローバル ゲートウェイはありません。route printルートを取得すると、優先順位が付けられていることがわかります。これにより、このゲートウェイまたはそのゲートウェイが効果的に使用されるかどうかが規定されます。これは、どのルートが使用されるかによって異なります。

于 2013-02-27T19:56:47.833 に答える
1

WINAPI を使用したいので、GetAdapterAddressesが最適なオプションかもしれません。

GAA_FLAG_INCLUDE_GATEWAYS | GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_MULTICAST

IP_ADAPTER_ADDRESSES 関数のドキュメントはこちらです。

于 2014-06-24T17:42:30.603 に答える
0

通常、GetAdaptersInfo (Roman R の回答による) またはできれば GetAdapterAddresses (専門家の回答による) を使用してアダプターを一覧表示し、正確に 1 つのアダプターには正確に 1 つのゲートウェイが構成されます。ただし、推奨されませんが、複数のデフォルト ゲートウェイを設定することは可能です。ただし、複数のデフォルト ゲートウェイを持つコンピュータでは、GetBestRoute関数によって、現在使用されているゲートウェイがわかると思います。これはいつでも変更される可能性があることに注意してください。

複数のアダプタにゲートウェイが構成されている場合にのみ、GetBestRoute を呼び出して、特定の接続に使用される可能性が最も高いデフォルト ゲートウェイを決定する必要があります。複数のデフォルト ゲートウェイが存在する場合、本質的に他のゲートウェイよりも「優れている」とは見なされないことに注意してください。つまり、このシナリオでは「デフォルト ゲートウェイ」などは存在せず、「デフォルト ゲートウェイ」のみが存在します。

于 2013-02-27T23:05:04.810 に答える