• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            興海北路

            ---男兒仗劍自橫行
            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            • 隨筆 - 85
            • 文章 - 0
            • 評論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識啊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            HTTP協議的C語言編程實現實例
            大家都很熟悉HTTP協議的應用,因為每天都在網絡上瀏覽著不少東西,也都知道是HTTP協議是相當簡單的。每次用到FlashGet之類的下載軟件下載網頁,當用到那個“用FlashGet下載全部鏈接”時總覺得很神奇。
            后來想想,其實要實現這些下載功能也并不難,只要按照HTTP協議發送request,然后對接收到的數據進行分析,如果頁面上還有href之類的鏈接指向標志就可以進行深一層的下載了。HTTP協議目前用的最多的是1.1版本,要全面透徹地搞懂它就參考RFC2616文檔吧。
            下面是我用C語言編程寫的一個http下載程序,希望對大家有些啟發。源代碼如下:

            /******* http客戶端程序 httpclient.c ************/
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <sys/types.h>
            #include <sys/socket.h>
            #include <errno.h>
            #include <unistd.h>
            #include <netinet/in.h>
            #include <limits.h>
            #include <netdb.h>
            #include <arpa/inet.h>
            #include <ctype.h>

            //////////////////////////////httpclient.c 開始///////////////////////////////////////////

            /********************************************
            功能:搜索字符串右邊起的第一個匹配字符
            ********************************************/
            char * Rstrchr(char * s, char x)  {
              int i = strlen(s);
              if(!(*s))  return 0;
              while(s[i-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);
                  file[strlen(pB) - 1] = 0;
                }
              }
              else  memcpy(web, pA, strlen(pA));
              if(pB)  web[strlen(pA) - strlen(pB)] = 0;
              else  web[strlen(pA)] = 0;
              pA = strchr(web, ':');
              if(pA)  *port = atoi(pA + 1);
              else *port = 80;
            }

            /*********************************************************************
            *filename: httpclient.c
            *purpose: HTTP協議客戶端程序,可以用來下載網頁
            *wrote by: zhoulifa(zhoulifa@163.com) 周立發(http://zhoulifa.bokee.com)
                       Linux愛好者 Linux知識傳播者 SOHO族 開發者 最擅長C語言
            *date time:2006-03-11 21:49:00
            *Note: 任何人可以任意復制代碼并運用這些代碼,當然包括你的商業用途
            *                         但請遵循GPL
            *********************************************************************/
            int main(int argc, char *argv[])
            {
              int sockfd;
              char buffer[1024];
              struct sockaddr_in server_addr;
              struct hostent *host;
              int portnumber,nbytes;
              char host_addr[256];
              char host_file[1024];
              char local_file[256];
              FILE * fp;
              char request[1024];
              int send, totalsend;
              int i;
              char * pt;

              if(argc!=2)
              {
                fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
                exit(1);
              }
              printf("parameter.1 is: %s\n", argv[1]);
              ToLowerCase(argv[1]);/*將參數轉換為全小寫*/
              printf("lowercase parameter.1 is: %s\n", argv[1]);

              GetHost(argv[1], 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=*((struct in_addr *)host->h_addr);

              /* 客戶程序發起連接請求 */
              if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-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, '/');
              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:%s\n\n", 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!%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));
                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(buffer[0] == '\r' || buffer[0] == '\n')  i++;
                  else i = 0;
                  printf("%c", buffer[0]);/*把http頭信息打印在屏幕上*/
                }
                else  {
                  fwrite(buffer, 1, 1, fp);/*將http主體信息寫入文件*/
                  i++;
                  if(i%1024 == 0)  fflush(fp);/*每1K時存盤一次*/
                }
              }
              fclose(fp);
              /* 結束通訊 */
              close(sockfd);
              exit(0);
            }
            //////////////////////////////httpclient.c 結束///////////////////////////////////////////

            posted on 2008-06-30 10:03 隨意門 閱讀(607) 評論(0)  編輯 收藏 引用

            久久精品亚洲福利| 久久精品中文字幕一区| 亚洲综合久久久| 日日狠狠久久偷偷色综合96蜜桃| 久久强奷乱码老熟女| 浪潮AV色综合久久天堂| 无码国内精品久久人妻| 久久99热国产这有精品| 久久久噜噜噜久久| 久久精品国产清自在天天线 | 久久精品国产精品亚洲艾草网美妙| 日本福利片国产午夜久久| 武侠古典久久婷婷狼人伊人| 亚洲乱码精品久久久久..| 亚洲成色999久久网站| 久久综合亚洲鲁鲁五月天| 国产精品va久久久久久久| 久久精品国产第一区二区三区| 国产精品无码久久四虎| 亚洲中文字幕无码久久2020| 色综合久久天天综线观看| 精品久久无码中文字幕| 无码人妻久久久一区二区三区| 亚洲国产精品久久久久婷婷软件| 久久久久久久综合狠狠综合| 婷婷综合久久狠狠色99h| 97视频久久久| 深夜久久AAAAA级毛片免费看| 99国产欧美精品久久久蜜芽| 久久久久亚洲精品无码蜜桃| 亚洲欧美国产精品专区久久 | 色综合久久久久无码专区| 久久久久国产精品三级网| 久久精品无码一区二区三区| 麻豆AV一区二区三区久久| 国内精品久久久久影院薰衣草| 久久综合视频网站| 一本大道久久东京热无码AV| 无码任你躁久久久久久久| 久久免费大片| 无码任你躁久久久久久久|