当前位置:编程学习 > 网站相关 >>

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

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,