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

興海北路

---男兒仗劍自橫行
<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>
            午夜精品久久久久久久久久久久 | 国产精品久久久久久av福利软件 | 亚洲人成免费| 亚洲一区二区三区免费观看| 亚洲一卡二卡三卡四卡五卡| 亚洲一区二区欧美| 香蕉免费一区二区三区在线观看| 亚洲午夜伦理| 欧美高清视频| 亚洲精品久久视频| 亚洲视频一区| 久久久久高清| 欧美日韩123| 国产欧美日韩在线| 亚洲高清一区二| 亚洲综合日韩在线| 久久综合导航| 99国内精品久久| 久久久久久电影| 欧美日韩在线一区| 国内外成人免费视频| 日韩亚洲视频| 久久视频一区| 亚洲午夜黄色| 欧美精品国产精品| 国产欧美日韩综合精品二区| 91久久黄色| 久久久久久97三级| 亚洲美女色禁图| 久久综合给合| 国产欧美日韩不卡| 亚洲视频欧美视频| 欧美成人在线免费观看| 亚洲欧美日韩精品| 欧美日韩精品在线观看| 亚洲电影在线免费观看| 欧美一区二区免费| 在线亚洲自拍| 欧美日韩一区二区精品| 亚洲欧洲在线一区| 免播放器亚洲| 欧美在线视频二区| 国产精品尤物| 午夜精品久久久久久久久| 亚洲美女精品一区| 欧美精品不卡| 亚洲第一精品在线| 久久午夜羞羞影院免费观看| 午夜天堂精品久久久久| 欧美午夜不卡影院在线观看完整版免费 | 欧美中文字幕视频在线观看| 欧美先锋影音| 一本一本久久| 亚洲精品在线视频| 欧美日本网站| 夜夜嗨av一区二区三区中文字幕| 美女国产精品| 久久久久欧美精品| 加勒比av一区二区| 老司机免费视频一区二区| 香港久久久电影| 国产精品日韩久久久| 欧美精品一区二区三区很污很色的 | 欧美在线日韩在线| 一区二区三区在线观看欧美| 久久天天躁狠狠躁夜夜爽蜜月| 欧美一级播放| 伊人久久亚洲热| 欧美a级片一区| 久久亚洲精品网站| 亚洲人体一区| 夜夜精品视频| 国产日韩欧美一区二区| 久久夜色精品国产噜噜av| 欧美影院在线播放| 亚洲国产mv| 日韩一级精品视频在线观看| 国产精品高清在线观看| 久久久久久91香蕉国产| 老色鬼精品视频在线观看播放| 亚洲福利久久| 最新高清无码专区| 国产精品久久久对白| 久久久久五月天| 免费h精品视频在线播放| 日韩视频欧美视频| 亚洲一区二区高清| 亚洲高清色综合| 一本到12不卡视频在线dvd| 国模私拍视频一区| 亚洲精品欧美日韩专区| 国产视频精品xxxx| 亚洲电影在线| 国产日韩精品一区二区| 欧美aⅴ一区二区三区视频| 欧美日韩在线观看一区二区| 欧美在线网址| 欧美黄色网络| 久久青青草原一区二区| 久久精品91久久香蕉加勒比| 日韩亚洲欧美一区| 欧美在线1区| 久久久久久有精品国产| 亚洲一区国产| 欧美二区在线| 久久精品亚洲| 欧美日韩在线视频首页| 欧美大片18| 国产网站欧美日韩免费精品在线观看| 亚洲高清av在线| 国内成+人亚洲| 亚洲图片欧洲图片av| 亚洲精品视频一区| 久久成人一区二区| 欧美一区二区三区免费观看| 欧美精品午夜| 久久免费视频在线观看| 久久国产视频网| 欧美少妇一区| 亚洲精品国偷自产在线99热| 亚洲丰满在线| 久久亚洲国产精品一区二区 | 亚洲一区二区三区在线播放| 久久黄金**| 香蕉成人久久| 欧美午夜视频一区二区| 亚洲精品一区中文| 亚洲精品日韩在线观看| 久久影视三级福利片| 久久久久久亚洲精品杨幂换脸 | 99国内精品久久| 欧美成人一品| 亚洲黄色影片| 亚洲精品午夜精品| 欧美国产大片| 亚洲国产婷婷综合在线精品| 亚洲精品一二| 欧美日韩精品是欧美日韩精品| 亚洲美女视频在线观看| 亚洲天堂av在线免费| 欧美日韩三级电影在线| 亚洲深夜av| 欧美中文日韩| 狠狠色伊人亚洲综合网站色| 久久国产黑丝| 欧美激情一区二区三区高清视频| 91久久中文| 欧美高清影院| 亚洲视频在线一区| 久久久久久久国产| 91久久亚洲| 欧美日韩久久不卡| 亚洲欧美久久| 欧美aⅴ99久久黑人专区| 亚洲精品免费看| 欧美亚州韩日在线看免费版国语版| 亚洲小说区图片区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲国产精品小视频| 欧美日本国产| 亚洲在线成人精品| 欧美国产日韩亚洲一区| 夜夜精品视频| 国产一区三区三区| 欧美伦理a级免费电影| 亚洲一区二区三区精品在线| 久久婷婷国产麻豆91天堂| 亚洲乱码国产乱码精品精98午夜| 欧美性久久久| 久久久久久夜精品精品免费| 亚洲日本欧美天堂| 久久精品亚洲热| 99亚洲一区二区| 国产综合色产在线精品| 欧美激情一区二区久久久| 亚洲欧美制服中文字幕| 欧美激情视频网站| 欧美在线精品免播放器视频| 在线观看av一区| 国产精品午夜电影| 欧美成人激情在线| 久久九九国产精品怡红院| 一本色道久久加勒比88综合| 欧美成人精品高清在线播放| 亚洲男人第一网站| 亚洲乱码国产乱码精品精天堂| 国产欧美精品日韩精品| 免费日韩成人| 一区二区三区欧美视频| 欧美日韩国产精品成人| 欧美一区二区三区免费视频| 亚洲人体偷拍| 狼人社综合社区| 亚洲欧洲av一区二区三区久久| 亚洲黄色免费电影| 国内成+人亚洲| 国产日韩欧美在线播放| 国产精品成人观看视频免费 | 亚洲麻豆av| 亚洲国产精品久久91精品|