全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年规范化工程维修协议样本
- 2024年度防火涂料施工承包协议
- 2024公司股东股权转让协议
- 2024商业合作协议模板
- 2024届安徽省阜阳市第一中学高三高考全真模拟卷(七)数学试题
- 2024年专业建材购销协议格式
- 2023-2024学年重庆一中高三招生统考(二)数学试题模拟试卷
- 2024年幼儿照护服务协议范例
- 2024专业不锈钢定制加工协议范本
- 2024定制大客车租赁业务协议
- 十二指肠溃疡伴穿孔的护理查房
- 市场营销策划(本)-形考任务三(第八~十章)-国开(CQ)-参考资料
- 中信证券测评真题答案大全
- 部编版小学六年级道德与法治上册全册知识点汇编
- 数字时代的数字化政府
- 文旅推广短片策划方案相关7篇
- 2023-2024学年高中主题班会燃激情之烈火拓青春之华章 课件
- 中医药文化进校园-中医药健康伴我行课件
- 市政管道开槽施工-市政排水管道的施工
- 居住建筑户型分析
- 机电一体化职业生涯
评论
0/150
提交评论