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

posts - 297,  comments - 15,  trackbacks - 0

大家都很熟悉HTTP協議的應用,因為每天都在網絡上瀏覽著不少東西,也都知道是HTTP協議是相當簡單的。每次用 thunder之類的下載軟件下載網頁,當用到那個“用thunder下載全部鏈接”時總覺得很神奇。
后來想想,其實要實現這些下載功能也并不難,只要按照HTTP協議發送request,然后對接收到的數據進行分析,如果頁面上還有href之類的鏈接指 向標志就可以進行深一層的下載了。HTTP協議目前用的最多的是1.1 版本,要全面透徹地搞懂它就參考RFC2616文檔吧。我是怕rfc文檔了的,要看自己去看吧^_^
源代碼如下:
/******* 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) {*s=tolower(*s);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;
}


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);
}


zj@zj:~/C_pram/practice/http_client$ ls
httpclient  httpclient.c
zj@zj:~/C_pram/practice/http_client$ ./httpclient http://www.baidu.com/
parameter.1 is: http://www.baidu.com/
lowercase parameter.1 is: http://www.baidu.com/
webhost:www.baidu.com
hostfile:
portnumber:80

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: www.baidu.com:80
Connection: Close

local filename to write:index.html

163 bytes send OK!

The following is the response header:
HTTP/1.1 200 OK
Date: Wed, 29 Oct 2008 10:41:40 GMT
Server: BWS/1.0
Content-Length: 4216
Content-Type: text/html
Cache-Control: private
Expires: Wed, 29 Oct 2008 10:41:40 GMT
Set-Cookie: BAIDUID=A93059C8DDF7F1BC47C10CAF9779030E:FG=1; expires=Wed, 29-Oct-38 10:41:40 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "

zj@zj:~/C_pram/practice/http_client$ ls
httpclient  httpclient.c  index.html

不指定文件名字的話,默認就是下載網站默認的首頁了^_^.

from:
http://blog.chinaunix.net/u2/76292/showart_1353805.html

posted on 2010-06-27 23:16 chatler 閱讀(1506) 評論(0)  編輯 收藏 引用 所屬分類: Network
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人精品福利| 久久久久久久性| 国产乱码精品一区二区三区不卡 | 久久青青草原一区二区| 久久精品视频在线观看| 亚洲国产欧美一区二区三区同亚洲| 麻豆免费精品视频| 欧美激情视频网站| 欧美激情一区二区三区四区| 亚洲一区久久久| 先锋影音久久久| 亚洲国产一区二区a毛片| 亚洲精选久久| 国产亚洲欧美激情| 欧美二区在线看| 欧美体内谢she精2性欧美| 久久se精品一区精品二区| 久久精品视频在线看| 99re亚洲国产精品| 亚洲欧美日韩中文在线制服| 雨宫琴音一区二区在线| 日韩午夜剧场| 一区二区在线免费观看| 亚洲精品一区中文| 国内精品久久国产| 99re热这里只有精品视频| 国产一区二区三区久久| 亚洲精品国产品国语在线app| 欧美性大战久久久久久久| 久久久久久一区二区| 欧美日韩精品一区二区三区| 久久精品99无色码中文字幕| 欧美人与禽猛交乱配视频| 久久aⅴ国产紧身牛仔裤| 欧美精品在线观看一区二区| 久久精品一区二区三区四区| 欧美日韩另类国产亚洲欧美一级| 六月婷婷久久| 国产欧美一区二区色老头 | 欧美91视频| 国产三级欧美三级| 中文日韩电影网站| 亚洲精品男同| 久久资源在线| 噜噜噜91成人网| 国产综合色在线| 亚洲欧美www| 亚洲综合精品| 欧美日韩在线观看视频| 亚洲国产另类久久久精品极度| 国产亚洲美州欧州综合国| 在线视频精品一| 日韩一级大片| 欧美精品一区二区蜜臀亚洲| 久久综合九色综合久99| 国产亚洲欧洲| 久久精品中文字幕一区| 久久久久国产一区二区| 国产亚洲福利| 校园春色国产精品| 久久亚洲综合网| 黄色日韩在线| 美女诱惑一区| 91久久久在线| 亚洲视频免费看| 欧美午夜精品久久久久久超碰| 亚洲伦理中文字幕| 亚洲网站在线观看| 国产精品久久二区二区| av成人免费在线| 午夜伦欧美伦电影理论片| 国产精品免费看片| 午夜在线视频观看日韩17c| 精品动漫3d一区二区三区免费版| 欧美在线视频一区二区三区| 久久久亚洲综合| 18成人免费观看视频| 久久亚洲精品一区二区| 亚洲高清一区二区三区| 一区二区91| 国产麻豆日韩欧美久久| 久久久久久噜噜噜久久久精品 | 久久精品国产亚洲aⅴ| 狠狠爱www人成狠狠爱综合网| 久久精品噜噜噜成人av农村| 欧美电影在线| 亚洲在线观看视频网站| 国产专区欧美精品| 欧美国产视频日韩| 亚洲尤物在线| 欧美国产一区二区在线观看 | 国产美女搞久久| 久久精品国产精品亚洲精品| 亚洲国产精品尤物yw在线观看| 夜夜夜久久久| 国外成人在线视频| 欧美日韩成人综合| 欧美亚洲视频在线观看| 亚洲高清不卡在线| 久久精品国产91精品亚洲| 亚洲国产精品久久久久婷婷884| 欧美日韩精品一区二区天天拍小说 | 亚洲一区二区成人在线观看| 国产日韩专区| 欧美日韩成人一区二区| 午夜日韩福利| 亚洲人精品午夜| 老司机久久99久久精品播放免费| 一本久久综合| 亚洲国产高清在线观看视频| 国产精品福利片| 欧美黄色免费| 老司机成人在线视频| 亚洲一区二区三区欧美| 亚洲国产精品一区二区久| 久久九九热re6这里有精品| 亚洲色诱最新| 野花国产精品入口| 在线精品视频一区二区| 国产乱码精品一区二区三区不卡| 欧美喷水视频| 欧美国产一区二区在线观看| 久久久久久亚洲精品中文字幕| 亚洲一区二区三区在线| 亚洲乱亚洲高清| 亚洲国产成人一区| 蜜臀av一级做a爰片久久| 欧美一区二区视频在线观看2020| 日韩视频免费观看| 亚洲区国产区| 亚洲国产一区在线观看| 国产在线拍揄自揄视频不卡99 | 久久综合亚洲社区| 久久久高清一区二区三区| 亚洲欧美电影在线观看| 亚洲网站在线观看| 亚洲视频电影在线| 亚洲一二三四久久| 亚洲一区二区网站| 久久久精品国产一区二区三区 | 亚洲精品乱码久久久久久久久| 亚洲国产欧美日韩| 最近中文字幕日韩精品 | 午夜国产精品视频| 亚洲欧美日韩精品久久奇米色影视| 亚洲视频欧美在线| 亚洲一区二区三区视频| 性色一区二区| 久久久亚洲国产美女国产盗摄| 久久日韩粉嫩一区二区三区 | av成人免费| 亚洲影院色无极综合| 亚洲欧美日韩网| 欧美一区午夜精品| 久久先锋资源| 亚洲福利一区| 一区二区三区免费观看| 亚洲欧美在线一区二区| 久久久91精品国产一区二区精品| 久久天天狠狠| 欧美日韩国产区| 国产精品一区二区久久久| 国产一区二区电影在线观看| 在线看国产日韩| 一本久久精品一区二区| 欧美一区二区视频在线| 欧美国产在线视频| 一区二区高清视频| 久久aⅴ国产欧美74aaa| 欧美激情亚洲精品| 国产精品实拍| 亚洲第一精品夜夜躁人人爽| av不卡在线观看| 久久久久久国产精品一区| 亚洲第一区在线| 亚洲主播在线| 欧美激情视频一区二区三区在线播放 | 一区在线免费观看| 日韩一级欧洲| 欧美中文字幕在线播放| 亚洲成人在线免费| 久久久久久久999| 欧美性猛交xxxx乱大交蜜桃| 好吊视频一区二区三区四区| 一本一本久久a久久精品牛牛影视| 欧美亚洲一区在线| 亚洲日本aⅴ片在线观看香蕉| 午夜久久一区| 欧美日韩高清在线一区| 黄色日韩网站| 久久精品成人一区二区三区| 亚洲清纯自拍| 猫咪成人在线观看| 国产综合香蕉五月婷在线| 亚洲小说欧美另类社区| 欧美国产精品v| 久久精品视频导航| 国产精品一区二区久久久| 中文国产成人精品久久一| 欧美不卡视频一区发布|