c++下载网页的代码,VC6.0编译通过

阅读更多

#include     
#include  
#pragma   comment(lib,   "ws2_32.lib ")   
using   namespace   std;   
    

   
void   main()  
{  
///初始化Socket函数库  
WSADATA   wsaData;  
if(   WSAStartup(MAKEWORD(2,0),   &wsaData)  
||   LOBYTE(wsaData.wVersion)   !=   2   )  
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.hjsm.net ");  
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.hjsm.net\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("c:\\1.dat",   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);  
break;  
}  
ofs.close();  
   
closesocket(sock);  
   
WSACleanup();  
}

你可能感兴趣的:(C#,C++,C,iOS,Socket)