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

興海北路

---男兒仗劍自橫行
<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| 免费永久网站黄欧美| 欧美国产91| 亚洲人成人一区二区三区| 久久蜜桃资源一区二区老牛 | 久久久福利视频| 日韩一级欧洲| 亚洲一区二区三区免费在线观看 | 欧美日韩在线观看一区二区三区| 欧美日韩一区二区三区在线| 欧美大片91| 欧美日韩一二三区| 国产精品久在线观看| 国产偷国产偷精品高清尤物| 亚洲东热激情| 亚洲性视频网址| 久久综合色综合88| 日韩视频国产视频| 久久精品动漫| 欧美少妇一区二区| 在线观看国产精品淫| 99精品国产在热久久下载| 亚洲欧美区自拍先锋| 麻豆精品在线视频| 亚洲图片欧美一区| 欧美成熟视频| 国产一区二区三区不卡在线观看| 日韩午夜电影av| 另类天堂av| 午夜免费电影一区在线观看| 欧美日韩aaaaa| 亚洲国产美女精品久久久久∴| 午夜激情久久久| 亚洲免费观看视频| 免费看亚洲片| 一区免费观看视频| 欧美中文字幕久久| 一区二区三区四区五区在线| 老牛国产精品一区的观看方式| 国产精品色婷婷| 亚洲视频第一页| 亚洲日韩视频| 欧美国产视频在线观看| 影音欧美亚洲| 噜噜爱69成人精品| 欧美一区二区三区视频在线观看 | 午夜精品久久久久久久久久久久久| 欧美高清视频一区| 亚洲观看高清完整版在线观看| 久久久久久久久久久一区| 中日韩男男gay无套 | 在线电影国产精品| 蜜臀av国产精品久久久久| 欧美在线播放视频| 国产区精品在线观看| 欧美一级久久| 亚洲一区二区三区精品在线| 欧美午夜视频网站| 欧美日韩中文另类| 日韩亚洲精品在线| 亚洲日本国产| 欧美日精品一区视频| 亚洲一区二区三区在线| 99热精品在线| 国产精品magnet| 亚洲欧美电影院| 亚洲午夜精品| 国产精品一级二级三级| 欧美一进一出视频| 久久九九国产精品| 亚洲国产精品高清久久久| 亚洲国产高清自拍| 欧美三区在线视频| 久久久国产精彩视频美女艺术照福利| 欧美一区二区视频在线观看| 影音先锋亚洲精品| 亚洲精品1234| 国产九九视频一区二区三区| 久久夜色精品国产噜噜av| 老司机午夜精品视频在线观看| 亚洲精品乱码久久久久| 99在线|亚洲一区二区| 国产日韩欧美成人| 欧美福利精品| 欧美网站大全在线观看| 久久久91精品国产一区二区三区| 久久久久亚洲综合| 亚洲私人影院| 久久久欧美精品sm网站| 一区二区三区视频在线| 先锋亚洲精品| 99精品国产在热久久下载| 香蕉久久a毛片| 日韩视频一区二区三区| 午夜精品视频网站| 亚洲精品乱码久久久久| 午夜精品理论片| 99国产精品99久久久久久| 亚洲欧美精品中文字幕在线| 亚洲国产欧洲综合997久久| 亚洲一区二区日本| 亚洲精品国产精品乱码不99| 午夜欧美大片免费观看| 99精品视频一区二区三区| 久久av免费一区| 亚洲在线免费| 免费在线日韩av| 久久精品日韩欧美| 欧美亚洲不卡| 亚洲人成网站影音先锋播放| 国产在线观看91精品一区| 99热免费精品| 一区二区黄色| 欧美高清自拍一区| 牛人盗摄一区二区三区视频| 亚洲啪啪91| 国产一区久久| 亚洲一区二区三区免费在线观看| 亚洲精品视频一区二区三区| 久久av老司机精品网站导航| 午夜精品久久久久99热蜜桃导演| 欧美激情aaaa| 9i看片成人免费高清| 久久精品麻豆| 欧美一区二区三区视频在线| 欧美日韩国产综合网| 亚洲电影有码| 亚洲激情综合| 免费成人在线观看视频| 玖玖在线精品| 激情综合网址| 久久午夜色播影院免费高清| 久久久久9999亚洲精品| 国产欧美1区2区3区| 亚洲在线视频免费观看| 性做久久久久久久久| 国产精品欧美久久| 亚洲午夜精品国产| 欧美在线一区二区| 国产亚洲激情| 久久久欧美一区二区| 欧美国产亚洲精品久久久8v| 最新国产の精品合集bt伙计| 欧美成人黑人xx视频免费观看| 亚洲大片免费看| 亚洲美女免费精品视频在线观看| 欧美国产第一页| 日韩视频精品在线| 午夜亚洲性色视频| 国产一区清纯| 你懂的视频欧美| 日韩亚洲欧美成人| 午夜国产精品影院在线观看| 国产一区日韩二区欧美三区| 老妇喷水一区二区三区| 亚洲免费观看高清在线观看 | 欧美在线日韩在线| 国产一区二区精品久久99| 久久精品夜色噜噜亚洲aⅴ| 欧美高清在线一区二区| 亚洲欧美日韩精品久久奇米色影视| 国产欧美va欧美不卡在线| 久久亚洲色图| 亚洲精品乱码久久久久久久久| 亚洲欧美日韩中文在线制服| 樱桃国产成人精品视频| 欧美三级午夜理伦三级中文幕 | 欧美高清视频| 亚洲性xxxx| 黄网站色欧美视频| 欧美日韩高清在线一区| 欧美一区二区网站| 亚洲人成网站精品片在线观看| 欧美在线一二三区| 一本色道久久综合亚洲精品小说 | 久久亚洲欧洲| 亚洲视屏在线播放| 亚洲电影在线观看| 国产精品无人区| 欧美国产亚洲另类动漫| 久久国产精品第一页| 亚洲欧美另类国产| 亚洲国产欧美一区二区三区久久| 国产精品白丝av嫩草影院| 久久久久中文| 亚洲欧美国产精品专区久久| 亚洲激情二区| 美女精品网站| 久久久久久久久久久一区| 亚洲五月六月| 日韩视频在线你懂得| 亚洲国产成人高清精品| 狠狠色丁香婷婷综合久久片| 国产精品免费区二区三区观看|