获取与外网通讯的真实ip地址

来源:互联网 发布:小键盘软件下载 编辑:程序博客网 时间:2024/05/18 13:06

#define STR_DEFAULTHOST  ("www.sohu.com")
char* GetIpByIndex(int nIndex)
{
 char* pszIp = NULL;
 PIP_ADAPTER_INFO pAdapterInfo;
 PIP_ADAPTER_INFO pAdapter = NULL;
 DWORD dwRetVal = 0;

 pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
 ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
 if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
 {
  free(pAdapterInfo);
  pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
 }

 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
 {
  pAdapter = pAdapterInfo;
  while (pAdapter)
  {
   printf("/tAdapter Addr: /t%02X:%02X:%02X:%02X:%02X:%02X/n", pAdapter->Address[0],
                  pAdapter->Address[1],
                  pAdapter->Address[2],
                  pAdapter->Address[3],
                  pAdapter->Address[4],
                  pAdapter->Address[5]);
   printf("/tIP Address: /t%s/n", pAdapter->IpAddressList.IpAddress.String);
   printf("/tIP Mask: /t%s/n", pAdapter->IpAddressList.IpMask.String); 
   printf("/tGateway: /t%s/n", pAdapter->GatewayList.IpAddress.String);
   
   if (nIndex == pAdapter->Index)
   {
    pszIp = new char[strlen(pAdapter->IpAddressList.IpAddress.String) + 1];
    strcpy(pszIp, pAdapter->IpAddressList.IpAddress.String);    
    break;
   }
   pAdapter = pAdapter->Next;
  }
 }

 if (NULL != pAdapterInfo)
 {
  free(pAdapterInfo);
 }
 return pszIp;
}

char* GetTrueIp()
{
 char* pszIp = NULL;
 IPAddr ipAddr;
 DWORD dwId = 0;
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData);
 hostent* pRemoteHost = gethostbyname(STR_DEFAULTHOST);
 if (NULL == pRemoteHost)
 {
  return pszIp;
 }
 memcpy(&ipAddr, pRemoteHost->h_addr_list[0], pRemoteHost->h_length);
 GetBestInterface(ipAddr, &dwId);
 pszIp = GetIpByIndex(dwId);
 printf("ip:%s", pszIp);
 return pszIp;
}