月亮图片- -| 回首页 | 2006年索引 | - -雷雨动画集锦---鲜花

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下运行通过。

【作者: 梅风剑】【访问统计:】【2006年10月20日 星期五 11:24】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=5775385

回复

验证码:   
评论内容: