青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

興海北路

---男兒仗劍自橫行
<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 隨意門 閱讀(619) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲激情视频网站| 亚洲人成网站999久久久综合| 亚洲一级免费视频| 99国产欧美久久久精品| 一区二区三区欧美视频| 在线中文字幕不卡| 性色一区二区三区| 久久久久久夜精品精品免费| 久久综合综合久久综合| 欧美日韩国产成人| 国产午夜精品一区二区三区欧美| 一区二区在线观看视频| 日韩视频在线一区二区三区| 亚洲一区尤物| 久热精品视频在线观看一区| 亚洲黄色尤物视频| 亚洲午夜激情在线| 久久久久久网址| 欧美日韩国产在线播放| 国产深夜精品| 99热这里只有精品8| 久久成人亚洲| 亚洲精品欧美精品| 久久黄色影院| 国产精品久久久久国产a级| 一色屋精品视频在线观看网站| 亚洲乱码日产精品bd| 欧美一区三区二区在线观看| 欧美激情二区三区| 性做久久久久久久免费看| 欧美伦理a级免费电影| 国内外成人免费视频 | 在线观看欧美精品| 亚洲一级二级在线| 欧美电影免费观看| 欧美一区中文字幕| 欧美日韩在线播放| 日韩视频一区二区在线观看| 亚洲欧美国产不卡| 亚洲欧洲另类国产综合| 久久视频一区二区| 国产视频亚洲精品| 亚洲欧美视频| 亚洲精品一区二区三区四区高清| 久久激情视频免费观看| 国产欧美日韩综合一区在线播放| 一本大道久久精品懂色aⅴ| 免费91麻豆精品国产自产在线观看| 亚洲一区二区三区免费观看| 欧美日韩国产二区| 一本色道久久综合亚洲二区三区| 欧美国产精品一区| 蜜桃久久av一区| 在线精品一区| 蜜臀99久久精品久久久久久软件| 性欧美长视频| 狠狠色丁香婷婷综合久久片| 久久久五月婷婷| 欧美在线播放一区二区| 狠狠色丁香婷婷综合久久片| 久热re这里精品视频在线6| 久久精品2019中文字幕| 亚洲第一视频| 亚洲高清自拍| 欧美精品一区二区精品网| 日韩视频免费观看高清完整版| 亚洲激情自拍| 欧美无乱码久久久免费午夜一区| 亚洲影视中文字幕| 香蕉久久夜色精品国产使用方法| 黑人一区二区三区四区五区| 裸体素人女欧美日韩| 欧美1级日本1级| 日韩亚洲在线| 一区二区三区毛片| 国产视频一区三区| 欧美国产精品日韩| 欧美图区在线视频| 久久久91精品国产| 能在线观看的日韩av| 在线亚洲欧美专区二区| 亚洲欧美日韩国产另类专区| 永久免费精品影视网站| 亚洲美女区一区| 国产亚洲成av人在线观看导航| 免费一级欧美片在线播放| 欧美电影在线观看完整版| 99re亚洲国产精品| 亚洲一区二区三区免费在线观看 | 另类综合日韩欧美亚洲| 美女国产一区| 中文精品视频| 久久精品国产91精品亚洲| 亚洲精品视频一区| 午夜日韩在线观看| 欧美激情第三页| 欧美日韩一区二区在线观看| 久久精品亚洲国产奇米99| 美女在线一区二区| 亚洲一本大道在线| 久久午夜视频| 午夜精品视频| 欧美二区乱c少妇| 欧美主播一区二区三区美女 久久精品人| 久久精品在线播放| 欧美亚洲日本网站| 欧美日韩国产成人在线观看| 久久蜜桃av一区精品变态类天堂| 欧美精品一区在线| 欧美成人亚洲成人日韩成人| 国产精品人人爽人人做我的可爱| 欧美福利一区二区| 国产日韩欧美一区二区三区在线观看 | 亚洲精品123区| 国内欧美视频一区二区| 亚洲午夜在线观看视频在线| 亚洲日韩视频| 久久露脸国产精品| 午夜国产精品视频免费体验区| 欧美成年人视频网站| 麻豆免费精品视频| 韩国亚洲精品| 亚洲欧美一区二区三区极速播放| 一区二区三区国产在线| 欧美91福利在线观看| 美玉足脚交一区二区三区图片| 国产欧美日韩精品专区| 亚洲午夜在线观看视频在线| 亚洲午夜激情网页| 欧美日韩在线播放一区| 亚洲精品欧美一区二区三区| 亚洲人成7777| 欧美成人午夜激情在线| 亚洲第一视频| 亚洲精品永久免费精品| 欧美极品在线观看| 亚洲美女av黄| 亚洲专区在线| 国产精品第十页| 亚洲综合色自拍一区| 久久国产精品免费一区| 国产一本一道久久香蕉| 久久成人这里只有精品| 欧美国产精品一区| 亚洲另类在线一区| 欧美日韩在线播放| 亚洲欧美一级二级三级| 久久视频一区| 亚洲高清中文字幕| 欧美激情久久久| 中文一区字幕| 久久婷婷成人综合色| 亚洲精品少妇网址| 欧美一区国产二区| 久久久国产一区二区| 一区二区三区在线看| 欧美v日韩v国产v| 一区二区日韩精品| 久久免费黄色| 亚洲精品中文在线| 国产视频在线观看一区| 日韩午夜视频在线观看| 欧美视频你懂的| 久久精品国产视频| 91久久精品日日躁夜夜躁国产| 亚洲在线播放| 亚洲国产cao| 国产精品久久久久av免费| 久久久久久9999| 99国内精品久久| 久久综合九色综合欧美就去吻 | 国产精品国产精品国产专区不蜜| 欧美亚洲尤物久久| 亚洲破处大片| 久久精品在线| 99精品国产福利在线观看免费| 国产精一区二区三区| 欧美暴力喷水在线| 欧美诱惑福利视频| 99精品福利视频| 欧美阿v一级看视频| 午夜精品久久久久久久99热浪潮| 亚洲国产精品第一区二区三区| 国产精品成人久久久久| 蜜臀av国产精品久久久久| 小黄鸭精品aⅴ导航网站入口 | 9色国产精品| 欧美高清一区二区| 性色av一区二区三区红粉影视| 亚洲黄色成人| 国产一区二区三区观看| 国产精品第三页| 欧美另类在线播放| 欧美成人免费观看| 久久久噜噜噜| 欧美一级二级三级蜜桃| 亚洲一区激情| 一本色道精品久久一区二区三区| 亚洲国产日韩欧美在线图片| 欧美顶级少妇做爰|