我很菜,最近在学网络编程.想做个小练习来实现http下载,准备直接用SOCKET来做.想要使用gethostbyname(),通过url来得到http服务器的ip地址.CString url;      //url里面是服务器的url,比如www.sina.com
hostent* host;
sockaddr_in site;
site.sin_family=AF_INET;
site.sin_port=htons(80);
host=gethostbyname(url.GetBuffer(url.GetLength()));
if (host==NULL)
{
TRACE("解析失败%d\n",WSAGetLastError);
return;
}
for(int i=0;host->h_addr_list[i]!=NULL;i++)
TRACE("ip=%s\n",inet_ntoa(((sockaddr_in*)(host->h_addr_list[i]))->sin_addr));代码大概就是这样,问题是得到的ip有时对,有时不对.比如用www.sohu.com得到的就是:
ip=61.135.131.180
ip=61.135.131.182
ip=61.135.131.183
ip=61.135.132.65
ip=61.135.132.80
ip=61.135.132.172
ip=61.135.132.173
ip=61.135.132.176
ip=61.135.145.47
ip=61.135.150.65
ip=61.135.150.67
ip=61.135.150.101
ip=61.135.150.113
ip=61.135.150.121
ip=61.135.150.145
ip=119.119.119.46(这个ip到底是个什么玩意儿啊……)用www.sina.com和其他一些网站的时候得到的返回就只有一个:
ip=119.119.119.46明显是不可用的,想知道为什么会返回这个值啊,查了n多资料百思不得其解。高手帮帮我吧。

解决方案 »

  1.   

    TRACE("ip=%s\n",inet_ntoa(*(struct in_addr*)(host->h_addr_list[i]) ) );
      

  2.   

    119.119.119.46是www.bool CGInetAddr::SynGetHostByName(const char* pszName, std::list<std::string> &listIPAddr)
    {
    struct hostent *pRet = ::gethostbyname(pszName);
    if (NULL == pRet){
    return false;
    }

    listIPAddr.clear(); for (struct in_addr** ppAddr = (struct in_addr**)pRet->h_addr_list; *ppAddr != NULL; ppAddr++ ){
    struct in_addr inaddr = *(struct in_addr*)(*ppAddr);
    char *pIPStr= inet_ntoa(inaddr);
    if (NULL == pIPStr) break;
    listIPAddr.push_back(std::string(pIPStr));
    } return listIPAddr.size() > 0;
    }