2013-07-10 2 views
1

Мое приложение работает на компьютере с несколькими сетевыми адаптерами (между 2-4), все подключены к другой внутренней сети.Идентификация конкретного сетевого адаптера

Мне нужно получить IP-адрес конкретного адаптера для использования в моем приложении, проблема в том, что я не знаю достаточной информации об этом адаптере. имена адаптера не являются постоянными, и ни одна из них не является сетевой маскировкой между ними или порядком, в котором они связаны (например, индексом).

Я также не могу полагаться на адрес pinging с помощью адаптеров, потому что, как я уже сказал, они подключены к различным сетям (поэтому конкретный адрес может использоваться из нескольких сетей), а также потому, что не все адаптеры должны быть подключены к сетям во все времена.

Что я знаю о адаптерах заключается в следующем:

  • IP-адрес является статическим для всех адаптеров (но, конечно, отличаются от применения многих машин).
  • Адаптер, в котором я нуждаюсь, является бортовым адаптером компьютера.

Есть ли какая-либо другая информация \ техника \ dark-voodoo Я могу использовать для идентификации конкретного адаптера?

мое приложение работает в C# -.Net 4, но поскольку это так критично, я бы использовал каждый язык CLI, wrapping или script в своем приложении, чтобы решить эту проблему.

+0

В адаптерах сети Device Manager есть место. Не уверен, что 0 всегда означает борт. И я не знаю, как получить эту информацию в .NET. – Paparazzi

+0

Я попытался спуститься по этой дороге, но, насколько я понимаю, встроенный адаптер был индексом 0, зависит от типа используемой материнской платы. и, как и многие другие факторы в моей проблеме, они не постоянны. –

ответ

0

Вам нужно использовать pInvoke GetBestInterface(), а затем найти интерфейс с этим индексом и получить его IpAddress.

[System.Runtime.InteropServices.DllImport("iphlpapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
     public static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex); 

    private string GetCorrectIPAddress(string server_ip_string) 
    { 
     string correctIpAddress = ""; 

     System.Net.IPAddress server_IpAddress = System.Net.Dns.GetHostEntry("server_ip_string").AddressList[0]; 

     UInt32 ipv4AddressAsUInt32 = BitConverter.ToUInt32(server_IpAddress.GetAddressBytes(), 0); 
     UInt32 interfaceindex; 

     int result = GetBestInterface(ipv4AddressAsUInt32, out interfaceindex); 
     foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      System.Net.NetworkInformation.IPInterfaceProperties ipProps = nic.GetIPProperties(); 
      if (ipProps.GetIPv4Properties().Index == interfaceindex) 
      { 
       correctIpAddress = ipProps.UnicastAddresses[0].Address.ToString(); 
      } 
     } 
     return correctIpAddress; 
    } 
+0

Из того, что я прочитал, GetBestInterface получает интерфейс, который имеет лучшее соединение с данным адресом (server_ip_string в вашем предположении, которое я предполагаю). Это не очень удобно, так как различные интерфейсы подключаются к разным и разным сетям. Каждый данный IP-адрес может быть сопоставлен на разных компьютерах в разных сетях, поэтому все интерфейсы могут иметь отличное соединение с данным адресом, но это разные машины. Кстати, не тратьте на это много времени, это три года, и эта система была заменена. –

Смежные вопросы