如何通过一个编程获得IP地址归属地的最简单办法

有时在网站应用程序中要显示对方的IP地址与它的归属地,一般来说,有下列几种办法。
1, 采用IP地址数据库。本地查询
     这个办法的优点是:查询速度最快,不依赖于外部网站。
     缺点是:要编写一定的数据库查询代码,而且你的数据库如果不是很新,则某些IP的查询结果会不正确。
        (有需要的可以在此留言,大虾米可以提供一个能找到的最新的IP地址库)
2,采用WebService查询。
       这里有一个最好的WebService
      http://www.webxml.com.cn/zh_cn/web_services_item.aspx?id=56647553443555386D2F4D3D
    缺点是:要编写一定的WebService查询代码。而且查询的结果是XML形式,需要进一步的解析。
3,调用某些查询网站的代码,如 http://www.ip.cn/
    缺点是:它会返回相当多的无关代码,难以解析出你想要的东西。
4, 调用气动隔膜泵网站链接直接查询
比如
http://www.tianqizx.cn/ip.aspx?ip=202.105.19.49
网站会直接返回查询的结果,如 “ 广东省佛山市 三水区”
不会有任何的杂信息干扰
win32 API并没有提供直接得到CPU占用率的气动隔膜泵函数,但提供GetProcessTimes()函数可以得到进程占用的CPU时间,通过和实际时间的流逝相比,可以得到某进程占用CPU的比率好了,
下面就是完整的C++代码。

// 得到当前进程的CPU占用率
class GetCPUPercentage
{
  private:
    CRITICAL_SECTION cs;  // 供多线程同步的临界区变量
    HANDLE hd;    // 空闲进程的句柄
    DWORD t1;     // 时间戳
    int percent;  // 最近一次计算的CPU占用率

    __int64 oldp;
    __int64 FileTimeToInt64(const FILETIME& time);
    int GetTime(__int64& proc);  // 得到进程占用的CPU时间
  public:
    GetCPUPercentage();
    ~GetCPUPercentage();

    int Get();  // 得到CPU占用率
};

GetCPUPercentage::GetCPUPercentage()
{
  InitializeCriticalSection(&cs);  // 初始化线程临界区变量

  percent = 0;   // 初始的占用率

  DWORD pid = GetCurrentProcessId();   // 得到当前进程id
  hd  = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);  // 通过id得到进程的句柄
  if( hd==NULL ){
     return;
  }

  // 得到初始时刻的值
  GetTime(oldp);
  t1 = GetTickCount();
}

GetCPUPercentage::~GetCPUPercentage()
{
  if( hd!=NULL ){
     CloseHandle(hd);
  }
  DeleteCriticalSection(&cs);
}

// 时间格式转换
__int64 GetCPUPercentage::FileTimeToInt64(const FILETIME& time)
{
  ULARGE_INTEGER tt;
  tt.LowPart = time.dwLowDateTime;
  tt.HighPart = time.dwHighDateTime;
  return(tt.QuadPart);
}

// 得到进程占用的CPU时间
int GetCPUPercentage::GetTime(__int64& proc)
{
  FILETIME create;
  FILETIME exit;
  FILETIME ker;  // 内核占用时间
  FILETIME user; // 用户占用时间
  FILETIME now;
  if( !GetProcessTimes(hd, &create, &exit, &ker, &user) ){
     return(-1);
  }

  proc = (FileTimeToInt64(ker) + FileTimeToInt64(user))/10000;
  return(0);
}

// 进行换算
int GetCPUPercentage::Get()
{
  if( hd==NULL )
     return(0);

  EnterCriticalSection(&cs);
    DWORD t2 = GetTickCount();
    DWORD dt = t2 - t1;
    if( dt>139 ){  // 毫秒数。用一个比较少的时间片作为计算单位,这个值可修改
       __int64 proc;
       GetTime(proc);

       percent = ((proc-oldp)*100)/dt;

       t1 = t2;
       oldp = proc;
    }
  LeaveCriticalSection(&cs);
  return(percent);
}

// 定义一个全局变量
GetCPUPercentage _cpu;

// 下面是用C++Bulider写的测试例子:
// --------------------------
// 在用一个时钟不停地显示当前的CPU占用率
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{http://www.it168.com/
  Label1->Caption = _cpu.Get();
}

//---------------------------------------------------------------------------
// 再弄个按钮
LRESULT WINAPI TestThread(LONG lParam)
{
  int n = lParam;
  for(int i=0 ;i<n; i++){
     Form1->Label2->Caption = i;
     Sleep(12);
  }
  return(0);
}
// 点击这个按钮会创建一些线程来把CPU整的繁忙些
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int n = atoi(Edit1->Text.c_str());
  DWORD dwThreadid;
  CreateThread(NULL

posted @ 2014-05-22 11:12  lanhe  阅读(1896)  评论(0编辑  收藏  举报
数据中心