1. 程式人生 > >VC++獲取外網IP的幾個方法

VC++獲取外網IP的幾個方法

一、CHttpFile方式

#include <afxinet.h>

int GetNetIp(char *IpAddr)

{

try
 {
  CInternetSession session("HttpClient");
  char * url = "http://bot.whatismyipaddress.com/";
  CHttpFile* pfile = (CHttpFile *)session.OpenURL(url);
  
  DWORD dwStatusCode;
  pfile -> QueryInfoStatusCode(dwStatusCode);
  if(dwStatusCode == HTTP_STATUS_OK)
  {
   CString content;
   CString data;
   while (pfile->ReadString(data))
   {
    content += data + "\r\n";
   }
   content.TrimRight();
   strcpy(IpAddr, content);
  }
  pfile -> Close();
  delete pfile;
  session.Close();

  return 0;
 }
 catch(...)
 {
  return -1;
 }

}

二、URLDownloadToFile方式

int GetIp(char *IpAddr)
{

int GetIp(char *IpAddr)
{
 try
 {
  char szTempFile [MAX_PATH];
  char szTempPath [MAX_PATH];

  GetTempPath(MAX_PATH, szTempPath); 
  UINT nResult=GetTempFileName (szTempPath, _T ("ip"),0,szTempFile);
  int ret=URLDownloadToFile(NULL,"

http://www.ip138.com/ip2city.asp",szTempFile,0,NULL);
  if (ret==S_OK) //如果下載成功
  {
   FILE *f;
   f=fopen(szTempFile,"rb");
   if(f)
   {
    fseek(f,0,SEEK_END);//得到檔案大小
    int ilength=ftell(f);
    fseek(f,0,SEEK_SET);
    if(ilength>0)
    {
     char szMyIp[16] = {0};
     char fBuffer[256] = {0};
     fread(fBuffer, 256, 1, f);
     int iBegin,iEnd;
     
     for (int i = 0; i < ilength; i++)
     {
      //取得"["的位置
      if (fBuffer[i] == 0x5b)
       iBegin = i;
      //取得"]"的位置
      if (fBuffer[i] == 0x5d)
      {
       iEnd = i;
       break;
      }
     }
     memcpy(szMyIp, fBuffer + iBegin + 1, iEnd - iBegin - 1);
     strcpy(IpAddr, szMyIp);
     return 0;
    }
   }
  }

  return 1;
 }
 catch(...)
 {
  return -1;
 }
}

}