c++ 上载 网页

c++ 下载 网页#includewinsock2.h#include iostream#includefstream#pragmacomment(lib,ws2_32.lib

c++ 下载 网页
#include <winsock2.h> 
#include <iostream>  
#include <fstream>
#pragma comment(lib, "ws2_32.lib ") //链接动态库 
using namespace std;  
   

   
void main()  
{  

///初始化Socket函数库  
WSADATA wsaData; //启动网络服务
if(WSAStartup(MAKEWORD(2,0),&wsaData)||LOBYTE(wsaData.wVersion)!=2)  
//MAKEWORD(2,0)宏定义,wVersion用户希望得到的版本号
return;  
   
struct protoent *ppe;  
ppe=getprotobyname("tcp"); //根据通信协议的名称获得该通信协议的其他数据  
 
///创建SOCKET对象  
SOCKET sock=socket(PF_INET, SOCK_STREAM, ppe->p_proto);  
if(sock==INVALID_SOCKET)  
return;  
   
///根据主机名获得IP地址  
hostent* pHostEnt=gethostbyname("www.wh.sdu.edu.cn");  
if(pHostEnt==NULL)  
return;  

int nTime=10000;  
setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTime,sizeof(nTime));  
setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTime,sizeof(nTime));  
   
///连接  
struct in_addr ip_addr;  
memcpy(&ip_addr,pHostEnt->h_addr_list[0],4);///h_addr_list[0]里4个字节,每个字节8位  
   
struct sockaddr_in destaddr;  
memset((void *)&destaddr,0,sizeof(destaddr));  
destaddr.sin_family=AF_INET;  
destaddr.sin_port=htons(80);  
destaddr.sin_addr=ip_addr;  
   
if(0!=connect(sock,(struct sockaddr*)&destaddr,sizeof(destaddr)))  
return;  
   
///格式化请求  
char request[] =  
"GET / HTTP/1.1\r\n"  
// "GET /book/2132/zip/gb.zip HTTP/1.1\r\n"  
// "Host:read.hjsm.net\r\n"  
"Host:www.wh.sdu.edu.cn\r\n"  
"Accept:*/*\r\n"  
// "Referer: http://curl.haxx.se/download.html\r\n "  
"User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n"  
// "Range: bytes=0-\r\n"  
"Pragma: no-cache\r\n"  
"Cache-Control: no-cache\r\n"  
"Connection:Close\r\n\r\n";  
// "Connection:Keep-Alive\r\n\r\n";  
   
///发送请求  
if(SOCKET_ERROR==send(sock,request,strlen(request),0))  
return;  
   
//---------Response----------  
// HTTP/1.1 200 OK  
// Date: Wed, 02 Feb 2005 08:42:09 GMT  
// Server: Apache  
// Last-Modified: Mon, 24 Jan 2005 13:17:07 GMT  
// ETag: "37a9ef-7635b-459bac0"  
// Accept-Ranges: bytes  
// Content-Length: 484187  
// Connection: close  
// Content-Type: application/zip  
   
// Transfer-Encoding: chunked - 当有该行存在时,content会是分块传送,每块有一个头,格式:"[16进制块大小,string]\r\n"  
   
int rcv_bytes=0;  
char buf[2049]={0,};  
ofstream ofs("e:\\1.txt",ios::binary|ios::out|ios::trunc);  
while(1)  
{  
rcv_bytes=recv(sock,buf,2048,0);  
if(rcv_bytes<=0)  
break;  
   
ofs.write(buf,rcv_bytes);  
cout<<buf; //输出接收到的消息
}  
ofs.close();  
   
closesocket(sock);  
   
WSACleanup(); //结束网络服务
}









问题 为什么这句话 
hostent* pHostEnt=gethostbyname("www.wh.sdu.edu.cn");  


if(pHostEnt==NULL)  
return;  

以www开头的网站可以成功 其他 比如 hi.baidu.com不行呢 
怎么解决



[解决办法]
改个别的方法 直接ping得到 ip再添上试试
[解决办法]
我这里没问题,能解析,应该不是程序问题,hi.baidu.com
gethostbyname()会发一个dns请求,试试写死在hosts文件中会怎么样,在试试抓包比较hi.baidu.com和www开头的域名dns包有什么区别。