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

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>
            欧美一级专区| 一本色道久久综合亚洲精品不| 亚洲欧洲三级| 在线看片欧美| 国产精品久久久久一区二区三区| 国产精品99久久久久久久久久久久| 亚洲专区免费| 最新高清无码专区| 国产亚洲高清视频| 国产精品av免费在线观看| 久久国产精品网站| 中国成人黄色视屏| 日韩一区二区精品| 另类天堂av| 免费永久网站黄欧美| 亚洲综合日韩在线| 午夜免费久久久久| 久久婷婷蜜乳一本欲蜜臀| 欧美一区二区三区四区在线观看地址| 久久久久久亚洲精品中文字幕| 99热在这里有精品免费| 亚洲国产经典视频| 狠狠久久婷婷| 精品51国产黑色丝袜高跟鞋| 在线欧美视频| 国产一区二区0| 久久精品在线播放| 欧美成人亚洲成人日韩成人| 欧美日韩一区二区欧美激情| 国产精品色一区二区三区| 在线日韩成人| 欧美在线播放视频| 亚洲美女在线看| 麻豆精品网站| 在线播放日韩欧美| 久久久噜噜噜久噜久久| 亚洲精品视频一区| 免费国产一区二区| 国产综合色在线| 欧美在线3区| 亚洲欧美中文日韩在线| 国产精品初高中精品久久| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产婷婷色一区二区三区在线 | 99视频+国产日韩欧美| 欧美一级电影久久| 国产麻豆日韩| 久久精品国产一区二区电影| 久久三级视频| 国产视频久久久久久久| 妖精视频成人观看www| 亚洲激情偷拍| 欧美精品www| 亚洲一区免费在线观看| 欧美成人情趣视频| 欧美国产一区在线| 国产精品夜夜夜| 亚洲一区欧美激情| 欧美专区第一页| 亚洲美女福利视频网站| 亚洲宅男天堂在线观看无病毒| 国产字幕视频一区二区| 亚洲精品极品| 亚洲国产日韩一区| 久久精品国产精品亚洲综合| 亚洲中字在线| 欧美日韩在线免费观看| 欧美jjzz| 亚洲黄色一区二区三区| 久久综合给合久久狠狠狠97色69| 亚洲欧美经典视频| 欧美视频精品一区| 久久久久久网址| 国产偷久久久精品专区| 在线亚洲一区| 亚洲国产视频一区二区| 99一区二区| 亚洲一级黄色av| 欧美顶级少妇做爰| av成人免费| 欧美成人免费在线观看| 国产亚洲欧美激情| 亚洲国产精品久久久久婷婷老年 | 亚洲视频免费在线| 激情欧美丁香| 久久精品在线观看| 欧美成人官网二区| 亚洲经典自拍| 欧美日精品一区视频| 一区二区精品在线| 亚洲男人影院| 国产乱子伦一区二区三区国色天香| 这里只有视频精品| 久久久精品日韩| 亚洲三级网站| 国产日韩亚洲| 欧美成人69av| 亚洲综合日本| 亚洲啪啪91| 美日韩在线观看| 亚洲一区二区成人| 亚洲高清电影| 国产亚洲欧美日韩一区二区| 男男成人高潮片免费网站| 午夜精品久久久久| 一区二区成人精品| 欧美国产精品专区| 久久久噜噜噜久噜久久 | 欧美日韩亚洲精品内裤| 久久九九热re6这里有精品| 国产精品一区二区女厕厕| 久久一区二区三区av| 一区二区三区精品国产| 亚洲激情六月丁香| 久久亚洲春色中文字幕久久久| 亚洲一区二区三区影院| 中文在线一区| 日韩一区二区福利| 亚洲精品影院| 一区二区冒白浆视频| a91a精品视频在线观看| 日韩视频一区二区在线观看 | 久久爱www久久做| 欧美在线免费观看视频| 午夜精品福利视频| 午夜免费久久久久| 久久久久久久久岛国免费| 久久免费少妇高潮久久精品99| 久久精品30| 欧美劲爆第一页| 国产女人aaa级久久久级| 韩国一区二区三区美女美女秀| 黄色成人在线网址| 日韩一区二区精品| 国内视频一区| 亚洲国产老妈| 亚洲婷婷在线| 欧美暴力喷水在线| 欧美电影在线播放| 一本色道精品久久一区二区三区 | 在线观看日韩欧美| 久久精品国产第一区二区三区最新章节| 久热精品视频在线观看| 亚洲欧美日韩精品久久亚洲区| 欧美日韩精品免费看| 亚洲肉体裸体xxxx137| 亚洲国内在线| 亚洲夜晚福利在线观看| 裸体一区二区三区| 欧美一区二区三区久久精品| 欧美视频福利| 欧美一区二区三区四区高清| 久久久www| 亚洲欧美激情四射在线日 | 狂野欧美激情性xxxx欧美| 亚洲欧美电影在线观看| 欧美日韩一区二区三区在线看| 亚洲精品国产精品乱码不99按摩| 久久综合精品一区| 欧美精品久久久久久久免费观看| 亚洲毛片一区| 亚洲视频碰碰| 亚洲第一在线| 欧美中文字幕在线视频| 亚洲精选中文字幕| 久久夜色精品亚洲噜噜国产mv | 欧美日韩国产在线看| 欧美中文字幕在线播放| 欧美精品一区二区三| 久久精品女人的天堂av| 国产精品福利在线观看| 欧美激情第五页| 国产一区深夜福利| 在线视频你懂得一区| 亚洲国产一区在线| 美日韩精品免费观看视频| 一本色道**综合亚洲精品蜜桃冫 | 欧美ab在线视频| 亚洲国产欧美不卡在线观看| 久久riav二区三区| 欧美高清一区二区| 亚洲美女av在线播放| 久久婷婷国产综合国色天香| 国产精品亚洲不卡a| 欧美在线中文字幕| 99国产精品99久久久久久| 久久理论片午夜琪琪电影网| 91久久午夜| 亚洲免费观看| 国产女精品视频网站免费| 亚洲无限av看| 欧美一区二区在线免费播放| 国产色产综合产在线视频| 香蕉久久久久久久av网站| 99国产精品久久久久老师| 欧美精品三级| 久久精品日产第一区二区| 先锋资源久久| 国产日韩欧美在线一区| 老妇喷水一区二区三区|