HanDs
管理员

[Visual Studio文章] QQ对IP地址显示的实现原理 



相信QQ2004大家玩过吧!其中对好友的IP和哪个地方的显示是不是很爽的啊。哪就跟我来让我看来看究竟。以下为实现原理。

   首先载入Winsock动态库,代码如下:

 

int CIPAddressDlg::StartUp()
{

  WORD wVersionRequested;
  WSADATA wsaData;
  int err;

  wVersionReuqested = MAKEWORD(2, 0);
  err = WSAStartup(wVersionReuqested, &wsaData);

  if (err != 0)
  {
    return err;
  }
  if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0)
  {
    WSACleanup();
    return WSAVERNOTSUPPORTED;
  }
  return 0;
}


 

以下的GetLocalHostName()函数为现实获取计算机名称,

int CIPAddressDlg::GetLocalHostName(CString &sHostName)
{

  char szHostName[256];

  int nRectCode;

  nRectCode = gethostname(szHostName, sizeofa(szHostName));

  if (nRectCode != 0)

  {

    sHostName = _T("Not available");

    return WSAGetLastError();

  }

  sHostName = szHostName;

  return 0;

}

 
 

然后调用GetIPAddress来获取IP地址

int CIPAddressDlg::GetIPAddress(const CString &sHostName, CString &sIPAddress)
{

  struct hostent FAR *lpHostEnt = gethostbyname(sHostName);

  if (lpHostEnt == NELL)
  {
    sIPAddress = _T("");
    return WSAGetLastError();
  }

  LPSTR lpAddr = lpHostEnt->h_adr_list[0];

  if (lpAddr)
  {

    struct in_addr inAddr;

    memmove(&inAddr, lpAddr, 4);

    sIPAddress = inet_ntoa(inAddr);

    if (sIPAddress.IsEmpty())

      sIPAddress = _T("Not available");

  }

  return 0;

}

 
 

 

哈哈,一切就绪了,是不是很简单啊!

本程序是VC++6.0下运行通过。

 


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
QQ IP 地址显示的实现原理
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:1
北风之神
天堂鸟LV23
谢谢分享

2016-7-15 #2楼
游客组
快速回复