• <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年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            • 隨筆 - 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 隨意門 閱讀(606) 評論(0)  編輯 收藏 引用

            77777亚洲午夜久久多喷| 国产真实乱对白精彩久久| 久久只这里是精品66| 久久精品国产亚洲AV电影| 乱亲女H秽乱长久久久| 97久久精品无码一区二区天美| 国产一久久香蕉国产线看观看| 日本精品久久久久影院日本 | 久久99国产亚洲高清观看首页| 国产精品九九九久久九九| 久久亚洲色一区二区三区| 日本强好片久久久久久AAA| 久久夜色精品国产亚洲av| 久久久久亚洲AV无码网站| 久久最新免费视频| 97久久天天综合色天天综合色hd| 一级做a爰片久久毛片免费陪| 老色鬼久久亚洲AV综合| 伊人久久大香线蕉无码麻豆| 日本精品久久久久中文字幕8| 久久久久久精品无码人妻| 久久精品一区二区三区中文字幕| 久久婷婷五月综合色高清| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产精品热久久毛片| 无码人妻精品一区二区三区久久久 | 亚洲国产成人久久综合碰碰动漫3d | 久久精品国产亚洲av麻豆色欲 | 人人狠狠综合久久亚洲| 2020最新久久久视精品爱| 久久99精品国产麻豆| 日产精品久久久久久久性色| 精品国产青草久久久久福利| 亚洲欧美国产精品专区久久| 久久精品亚洲欧美日韩久久| 亚洲国产天堂久久综合网站 | 国产精品久久午夜夜伦鲁鲁| 久久精品国产亚洲AV久| 亚洲成色www久久网站夜月| 久久久久久久久久久精品尤物| 久久综合鬼色88久久精品综合自在自线噜噜|