http解析之客服端的实现.doc_第1页
http解析之客服端的实现.doc_第2页
http解析之客服端的实现.doc_第3页
http解析之客服端的实现.doc_第4页
http解析之客服端的实现.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大家都很熟悉HTTP协议的应用,因为每天都在网络上浏览着不少东西,也都知道是HTTP协议是相当简单的。每次用thunder之类的下载软件下载网页,当用到那个“用thunder下载全部链接”时总觉得很神奇。后来想想,其实要实现这些下载功能也并不难,只要按照HTTP协议发送request,然后对接收到的数据进行分析,如果页面上还有href之类的链接指向标志就可以进行深一层的下载了。HTTP协议目前用的最多的是1.1版本,要全面透彻地搞懂它就参考RFC2616文档吧。我是怕rfc文档了的,要看自己去看吧_源代码如下:/* http客户端程序 httpclient.c */#include#include#include#include#include#include#include#include#include#include#include#include/httpclient.c 开始/*功能:搜索字符串右边起的第一个匹配字符*/char*Rstrchr(char*s,charx)inti=strlen(s);if(!(*s)return0;while(si-1)if(strchr(s+(i-1),x)return(s+(i-1);elsei-;return0;/*功能:把字符串转换为全小写*/voidToLowerCase(char*s)while(s&*s)*s=tolower(*s);s+;/*功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件*/voidGetHost(char*src,char*web,char*file,int*port)char*pA;char*pB;memset(web,0,sizeof(web);memset(file,0,sizeof(file);*port=0;if(!(*src)return;pA=src;if(!strncmp(pA,http:/,strlen(http:/)pA=src+strlen(http:/);elseif(!strncmp(pA,https:/,strlen(https:/)pA=src+strlen(https:/);pB=strchr(pA,/);if(pB)memcpy(web,pA,strlen(pA)-strlen(pB);if(pB+1)memcpy(file,pB+1,strlen(pB)-1);filestrlen(pB)-1=0;elsememcpy(web,pA,strlen(pA);if(pB)webstrlen(pA)-strlen(pB)=0;elsewebstrlen(pA)=0;pA=strchr(web,:);if(pA)*port=atoi(pA+1);else*port=80;intmain(intargc,char*argv)intsockfd;charbuffer1024;structsockaddr_inserver_addr;structhostent*host;intportnumber,nbytes;charhost_addr256;charhost_file1024;charlocal_file256;FILE*fp;charrequest1024;intsend,totalsend;inti;char*pt;if(argc!=2)fprintf(stderr,Usage:%s web-address/a/n,argv0);exit(1);printf(parameter.1 is: %s/n,argv1);ToLowerCase(argv1);/*将参数转换为全小写*/printf(lowercase parameter.1 is: %s/n,argv1);GetHost(argv1,host_addr,host_file,&portnumber);/*分析网址、端口、文件名等*/printf(webhost:%s/n,host_addr);printf(hostfile:%s/n,host_file);printf(portnumber:%d/n/n,portnumber);if(host=gethostbyname(host_addr)=NULL)/*取得主机IP地址*/fprintf(stderr,Gethostname error, %s/n,strerror(errno);exit(1);/* 客户程序开始建立 sockfd描述符 */if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)/*建立SOCKET连接*/fprintf(stderr,Socket Error:%s/a/n,strerror(errno);exit(1);/* 客户程序填充服务端的资料 */bzero(&server_addr,sizeof(server_addr);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(portnumber);server_addr.sin_addr=*(structin_addr*)host-h_addr);/* 客户程序发起连接请求 */if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr)=-1)/*连接网站*/fprintf(stderr,Connect Error:%s/a/n,strerror(errno);exit(1);sprintf(request,GET /%s HTTP/1.1/r/nAccept: */*/r/nAccept-Language: zh-cn/r/n/User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)/r/n/Host: %s:%d/r/nConnection: Close/r/n/r/n,host_file,host_addr,portnumber);printf(%s,request);/*准备request,将要发送给主机*/*取得真实的文件名*/if(host_file&*host_file)pt=Rstrchr(host_file,/);elsept=0;memset(local_file,0,sizeof(local_file);if(pt&*pt)if(pt+1)&*(pt+1)strcpy(local_file,pt+1);elsememcpy(local_file,host_file,strlen(host_file)-1);elseif(host_file&*host_file)strcpy(local_file,host_file);elsestrcpy(local_file,index.html);printf(local filename to write:%s/n/n,local_file);/*发送http请求request*/send=0;totalsend=0;nbytes=strlen(request);while(totalsendnbytes)send=write(sockfd,request+totalsend,nbytes-totalsend);if(send=-1)printf(send error!%s/n,strerror(errno);exit(0);totalsend+=send;printf(%d bytes send OK!/n,totalsend);fp=fopen(local_file,a);if(!fp)printf(create file error! %s/n,strerror(errno);return0;printf(/nThe following is the response header:/n);i=0;/* 连接成功了,接收http响应,response */while(nbytes=read(sockfd,buffer,1)=1)if(i4)if(buffer0=/r|buffer0=/n)i+;elsei=0;printf(%c,buffer0);/*把http头信息打印在屏幕上*/elsefwrite(buffer,1,1,fp);/*将http主体信息写入文件*/i+;if(i%1024=0)fflush(fp);/*每1K时存盘一次*/fclose(fp);/* 结束通讯 */close(sockfd);exit(0);zjzj:/C_pram/practice/http_client$ lshttpclient httpclient.czjzj:/C_pram/practice/http_client$ ./httpclient /parameter.1 is: /lowercase parameter.1 is: /webhost:hostfile:portnumber:80GET / HTTP/1.1Accept: */*Accept-Language: zh-cnUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Host: :80Connection: Closelocal filename to write:index.html163 bytes send OK!The following is the response header:HTTP/1.1 200 OKDate: Wed, 29 Oct 2008 10:41:40 GMTServer: BWS/1.0Content-Length: 4216Content-Type: text/htmlCache-Control: privateExpires: Wed, 29 Oct 2008 10:41:40 GMTSet-Cookie: BAIDUID=A93059C8DD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论