Получение текущего IP-адреса из приложения (VC ++ 2005) - PullRequest
0 голосов
/ 13 мая 2009

Я хотел бы отправить электронное письмо из приложения, содержащее текущий IP-адрес устройства.

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

Я надеялся, что есть действительно простой способ, например, запустить ipconfig с помощью системной команды и получить полученный текст.

Я бы предпочел не открывать сокет.

Спасибо

Ответы [ 6 ]

1 голос
/ 02 августа 2014

Я обновил код "Jason Heine" (не знаю, как пометить имя) до c ++. теперь это должно работать. Кстати, спасибо ему. Вот что я получаю:

using namespace System;
using namespace System::Net;

void main(){
  String ^strHostName = String::Empty;
  // Getting Ip address of local machine...
  // First get the host name of local machine.
  strHostName = Dns::GetHostName();
  Console::WriteLine("Local Machine's Host Name: " + strHostName);

  // Then using host name, get the IP address list..
  IPHostEntry^ ipEntry = Dns::GetHostEntry(strHostName);
  array<IPAddress^> ^addr = ipEntry->AddressList;

  for (int i = 0; i < addr->Length; i++)
  {
      Console::WriteLine("IP Address {0}: {1} ", i, addr[i]->ToString());
  }
  Console::ReadKey();
}

Надеюсь, это поможет вам.

Протестировано На моем ПК с Wi-Fi и LAN-соединением и несколькими виртуальными автомобилями для «VMware Player», и я получаю 4 IPv6, а затем 4 IPv4. если вам нужен только IPv4, вы можете использовать:

using namespace System;
using namespace System::Net;

void main(){
  String ^strHostName = String::Empty;
  // Getting Ip address of local machine...
  // First get the host name of local machine.
  strHostName = Dns::GetHostName();
  Console::WriteLine("Local Machine's Host Name: " + strHostName);

  // Then using host name, get the IP address list..
  IPHostEntry^ ipEntry = Dns::GetHostEntry(strHostName);
  array<IPAddress^> ^addr = ipEntry->AddressList;

  for (int i = 0; i < addr->Length; i++)
  {
      if(addr[i]->ToString()->Length < 20){
          Console::WriteLine("IP Address {0}: {1} ", i, addr[i]->ToString());
      }
  }
  Console::ReadKey();
}

Тогда я получаю только IPv4. просто цифры начинаются с 4. Но для меня это нормально. Вы можете добавить новую переменную для пересчета нумерации:)

1 голос
/ 13 мая 2009

Этот код будет зацикливать все адаптеры и проверять наличие первого.

#include <afxtempl.h>
#include <afxsock.h>
#include <iphlpapi.h>

u_long GetFirstIpAddressUp(SOCKET s)
{
#define MAX_ADAPTERS    30
#pragma comment(lib, "Iphlpapi.lib")
    IP_ADAPTER_ADDRESSES AdapterAddresses[MAX_ADAPTERS];           
    PIP_ADAPTER_ADDRESSES pAdapterAddresses = AdapterAddresses;                                              
    DWORD dwBufLen = sizeof(AdapterAddresses);
    if (GetAdaptersAddresses(AF_INET, 0, NULL, AdapterAddresses,&dwBufLen) == ERROR_SUCCESS)
    {
        do {
            if ((pAdapterAddresses->OperStatus == IfOperStatusUp))
            {
                sockaddr_in* pAdr = (sockaddr_in*)pAdapterAddresses->FirstUnicastAddress->Address.lpSockaddr;
                return pAdr->sin_addr.S_un.S_addr;
            }
        pAdapterAddresses = pAdapterAddresses->Next;
        } while(pAdapterAddresses);
    }
    return INADDR_ANY;  // No adapters are up
}
1 голос
/ 13 мая 2009

РЕДАКТИРОВАТЬ: Хорошо, если я прочитал, что вы используете VC ++, а не C # .....

Так что вы можете игнорировать мой ответ или, возможно, использовать его в качестве руководства ...

вот, пожалуйста,

using System;
using System.Net;


namespace testProgram
{
    class Program
    {
        static void Main()
        {
            String strHostName = string.Empty;
            // Getting Ip address of local machine...
            // First get the host name of local machine.
            strHostName = Dns.GetHostName();
            Console.WriteLine("Local Machine's Host Name: " + strHostName);


            // Then using host name, get the IP address list..
            IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
            IPAddress[] addr = ipEntry.AddressList;

            for (int i = 0; i < addr.Length; i++)
            {
                Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
            }
            Console.ReadLine();

        }
    }

}

это даст вам всю необходимую информацию, а затем некоторую, вы сможете разобрать, что вам нужно и не нужно.

1 голос
/ 13 мая 2009

Используйте либо gethostbyname (устарело), ​​либо более новую getaddrinfo. Ссылки MSDN также содержат примеры.

0 голосов
/ 13 мая 2009

Конечно, getaddrinfo работает в вашем случае, но я подумал, что упомяну, что если вы все хотите больше, чем просто читать ip, вы можете использовать windows IP Helper api , чтобы сделать большую часть того, что ipconfig Утилита делает.

0 голосов
/ 13 мая 2009

Полагаю, вам может понадобиться заглянуть в winsock2.h

...