C编程实现http协议.doc_第1页
C编程实现http协议.doc_第2页
C编程实现http协议.doc_第3页
C编程实现http协议.doc_第4页
C编程实现http协议.doc_第5页
全文预览已结束

下载本文档

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

文档简介

C编程实现http协议发布日期:2009-03-13 来源:互联网 作者:佚名 大家都很熟悉HTTP协议的应用,因为每天都在网络上浏览着不少东西,也都知道是HTTP协议是相当简单的。每次用到FlashGet之类的下载软件下载网页,当用到那个“用FlashGet下载全部链接”时总觉得很神奇。后来想想,其实要实现这些下载功能也并不难,只要按照HTTP协议发送request,然后对接收到的数据进行分析,如果页面上还有href之类的链接指向标志就可以进行深一层的下载了。HTTP协议目前用的最多的是1.1版本,要全面透彻地搞懂它就参考RFC2616文档吧。下面是我用C语言编程写的一个http下载程序,希望对大家有些启发。源代码如下:/* http客户端程序 httpclient.c */#include #include #include #include #include #include #include #include #include #include #include #include /httpclient.c 开始/*功能:搜索字符串右边起的第一个匹配字符*/char * Rstrchr(char * s, char x) int i = strlen(s); if(!(*s) return 0; while(si-1) if(strchr(s + (i - 1), x) return (s + (i - 1); else i-; return 0;/*功能:把字符串转换为全小写*/void ToLowerCase(char * s) while(*s) *s=tolower(*s+);/*功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件*/void GetHost(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:/); else if(!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; else memcpy(web, pA, strlen(pA); if(pB) webstrlen(pA) - strlen(pB) = 0; else webstrlen(pA) = 0; pA = strchr(web, :); if(pA) *port = atoi(pA + 1); else *port = 80;/*filename: httpclient.c*purpose: HTTP协议客户端程序,可以用来下载网页*wrote by: zhoulifa() 周立发* Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言*date time:2006-03-11 21:49:00*Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途* 但请遵循GPL*/int main(int argc, char *argv) int sockfd; char buffer1024; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char host_addr256; char host_file1024; char local_file256; FILE * fp; char request1024; int send, totalsend; int i; char * pt; if(argc!=2) fprintf(stderr,Usage:%s web-addressan,argv0); exit(1); printf(parameter.1 is: %sn, argv1); ToLowerCase(argv1);/*将参数转换为全小写*/ printf(lowercase parameter.1 is: %sn, argv1); GetHost(argv1, host_addr, host_file, &portnumber);/*分析网址、端口、文件名等*/ printf(webhost:%sn, host_addr); printf(hostfile:%sn, host_file); printf(portnumber:%dnn, portnumber); if(host=gethostbyname(host_addr)=NULL)/*取得主机IP地址*/ fprintf(stderr,Gethostname error, %sn, strerror(errno); exit(1); /* 客户程序开始建立 sockfd描述符 */ if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)/*建立SOCKET连接*/ fprintf(stderr,Socket Error:%san,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=*(struct in_addr *)host-h_addr); /* 客户程序发起连接请求 */ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1)/*连接网站*/ fprintf(stderr,Connect Error:%san,strerror(errno); exit(1); sprintf(request, GET /%s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrnUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)rnHost: %s:%drnConnection: Closernrn, host_file, host_addr, portnumber); printf(%s, request);/*准备request,将要发送给主机*/ /*取得真实的文件名*/ if(host_file & *host_file) pt = Rstrchr(host_file, /); else pt = 0; memset(local_file, 0, sizeof(local_file); if(pt & *pt) if(pt + 1) & *(pt+1) strcpy(local_file, pt + 1); else memcpy(local_file, host_file, strlen(host_file) - 1); else if(host_file & *host_file) strcpy(local_file, host_file); else strcpy(local_file, index.html); printf(local filename to write:%snn, local_file); /*发送http请求request*/ send = 0;totalsend = 0; nbytes=strlen(request); while(totalsend nbytes) send = write(sockfd, request + totalsend, nbytes - totalsend); if(send=-1) printf(send error!%sn, strerror(errno);exit(0); totalsend+=send; printf(%d bytes send OK!n, totalsend); fp = fopen(local_file, a); if(!fp) printf(create file error! %sn, strerror(errno); return 0; printf(nThe following is the response header:n); i=0; /* 连接成功了,接收http响应,response */ while(nbytes=read(sockfd,buffer,1)=1) if(i 4) if(buffer0 = r

温馨提示

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

评论

0/150

提交评论