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

興海北路

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品一区| 久久久久这里只有精品| 亚洲精品国产精品国自产在线| 亚洲精品免费看| 欧美专区一区二区三区| 亚洲片在线观看| 久久露脸国产精品| 国产精品久久一级| 亚洲少妇在线| 亚洲日本欧美日韩高观看| 久久精品一二三区| 国产亚洲毛片在线| 午夜精品久久久久久久99热浪潮| 亚洲国产欧美一区| 麻豆精品在线视频| 在线日本欧美| 久久米奇亚洲| 久久久精品国产一区二区三区| 国产视频在线观看一区二区三区 | 亚洲裸体视频| 欧美黄色免费| 老色批av在线精品| 精品999网站| 免费久久99精品国产自| 久久久福利视频| 亚洲第一综合天堂另类专| 狼人天天伊人久久| 午夜免费久久久久| 猫咪成人在线观看| 亚洲国产精品尤物yw在线观看| 久久久久久电影| 久久国产精品99精品国产| 国产一区二区高清| 久久亚洲欧美| 你懂的成人av| 中文日韩在线| 亚洲一区一卡| 黑人巨大精品欧美一区二区 | 欧美激情一区三区| 欧美xx视频| 亚洲视频一区| 午夜在线电影亚洲一区| 狠狠操狠狠色综合网| 欧美成年视频| 欧美日韩高清在线一区| 欧美一区二区三区视频| 久久久久久高潮国产精品视| 亚洲激情社区| 亚洲一区二区在线看| 一区在线观看| 妖精成人www高清在线观看| 国产啪精品视频| 亚洲成人资源| 久久国产精品72免费观看| 欧美一区二区视频97| 在线观看日韩av电影| 亚洲精品视频啊美女在线直播| 欧美三级免费| 美女诱惑一区| 国产精品豆花视频| 久久综合九色综合欧美狠狠| 欧美日韩日本视频| 久久综合一区| 国产精品二区二区三区| 美女国内精品自产拍在线播放| 欧美激情片在线观看| 性欧美办公室18xxxxhd| 欧美成熟视频| 久久综合国产精品| 国产精品成人一区二区网站软件| 久久综合电影| 国产欧美日韩精品一区| 亚洲三级电影在线观看| 黄色av一区| 午夜精彩国产免费不卡不顿大片| 亚洲日韩欧美视频一区| 久久精选视频| 欧美在线视屏| 国产精品国产馆在线真实露脸 | 久久久久九九九| 亚洲免费中文| 欧美区视频在线观看| 免费观看在线综合| 国产精品一区视频| 亚洲黄网站在线观看| 亚洲国产欧美日韩精品| 久久男女视频| 亚洲视频电影图片偷拍一区| 伊人久久大香线| 久久免费国产精品| 中文亚洲字幕| 亚洲视频福利| 一区视频在线播放| 国产日韩欧美成人| 美女视频一区免费观看| 午夜精品久久| 狠狠色丁香婷婷综合久久片| 国产精品羞羞答答xxdd| 国产精品v欧美精品∨日韩| 国产精品视频自拍| 亚洲国产精品va在线看黑人| 亚洲毛片在线观看.| 亚洲视频一区二区| 久久成人免费| 欧美mv日韩mv亚洲| 亚洲免费大片| 亚洲一区免费视频| 国产精品超碰97尤物18| 欧美~级网站不卡| 欧美日韩国产综合视频在线| 国产精品亚洲视频| 日韩视频在线观看| 欧美肥婆bbw| 欧美一区二区三区在线看| 欧美大秀在线观看| 亚洲国产综合视频在线观看| 亚洲在线中文字幕| 夜久久久久久| 欧美v国产在线一区二区三区| 欧美乱妇高清无乱码| 国产亚洲一区二区在线观看| 亚洲一二三区视频在线观看| 91久久国产精品91久久性色| 亚洲欧美国产精品桃花| 国产精品日韩一区二区三区| 日韩视频一区二区在线观看 | 亚洲免费久久| 亚洲毛片视频| 亚洲国产欧美一区二区三区同亚洲 | 日韩视频免费大全中文字幕| 亚洲九九爱视频| 久久激情视频久久| 影音先锋日韩精品| 亚洲人成小说网站色在线| 久久手机免费观看| 国产精品人成在线观看免费 | 亚洲社区在线观看| 亚洲日本中文字幕免费在线不卡| 欧美日韩成人综合天天影院| 亚洲综合色自拍一区| 久久久久久久久综合| 国产欧美一区视频| 性欧美xxxx视频在线观看| 国产精品网曝门| 欧美一区二区久久久| 久久精品夜色噜噜亚洲aⅴ| 最新成人在线| 亚洲欧美成人| 国产精品美女久久久久av超清 | 久久久噜噜噜久久中文字幕色伊伊| 欧美在线综合| 一本一本久久a久久精品综合妖精| 亚洲欧美日韩国产中文| 99在线热播精品免费| 亚洲日本中文| 久久福利视频导航| 亚洲一级黄色av| 欧美丰满少妇xxxbbb| 亚洲高清成人| 一区二区三区**美女毛片| 久久人人九九| 久久精品亚洲一区二区| 欧美性久久久| 一区二区黄色| 日韩一级黄色片| 欧美福利一区二区| 亚洲经典在线| 国内成+人亚洲+欧美+综合在线| 欧美电影免费观看| 久久综合久久综合久久| 久久综合九色综合久99| 亚洲精品美女91| 国产欧美va欧美不卡在线| 欧美精品少妇一区二区三区| 午夜伦欧美伦电影理论片| 欧美日韩亚洲一区二区三区| 欧美国产在线视频| 亚洲电影在线免费观看| 亚洲精品少妇| 亚洲综合日韩在线| 国产精品午夜久久| 小黄鸭精品aⅴ导航网站入口| 午夜精品99久久免费| 国产精品国产三级国产普通话三级 | 国产精品久久久久久久久搜平片 | 亚洲精品欧美极品| 亚洲激情小视频| 久久综合久久88| 一区精品在线| 欧美日韩一区二区在线观看视频| 亚洲美女在线一区| 老司机精品视频一区二区三区| 亚洲最新在线| 亚洲精品国产精品国自产在线| 免费高清在线视频一区·| 亚洲日本中文字幕免费在线不卡| 午夜精品一区二区在线观看| 免费成人av在线看| 欧美一区二区私人影院日本| 久久久久国产精品一区三寸 |