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包有什么区别。
