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

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 閱讀(1510) 評論(0)  編輯 收藏 引用 所屬分類: Network
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(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久久久久久白浆小说| 性欧美xxxx大乳国产app| 欧美日韩一区二区在线观看视频| 亚洲作爱视频| 在线一区视频| 欧美精品日韩精品| 欧美国产日本高清在线| 亚洲五月婷婷| 久久国产黑丝| 国产亚洲一区二区精品| 中文欧美在线视频| 亚洲欧美在线x视频| 激情伊人五月天久久综合| 一区二区高清视频在线观看| 久久综合久久综合久久| 久久超碰97中文字幕| 亚洲视频精品在线| 久久不射电影网| 国产欧美va欧美va香蕉在| 欧美日韩在线视频一区| 国产精品高潮呻吟视频| 国产视频一区二区在线观看| 欧美日韩亚洲三区| 日韩亚洲欧美高清| 亚洲婷婷在线| 亚洲日产国产精品| 影音先锋久久久| 国产精品美女久久久浪潮软件 | 亚洲国产一区二区三区高清| 久久久欧美精品| 一区二区三区毛片| 亚洲私拍自拍| 欧美日韩大陆在线| 欧美国产日韩一区二区| 国产日韩欧美精品在线| 欧美成人有码| 激情久久中文字幕| 99亚洲视频| 最新亚洲一区| 亚洲永久免费视频| 国内精品久久久| 欧美一区二区三区四区视频| 久久久国产视频91| 免播放器亚洲一区| 国产在线精品二区| 麻豆91精品| 国产精品久久久久久久电影| 在线视频一区观看| 老牛影视一区二区三区| 中文日韩在线| 国产精品外国| 亚洲在线第一页| 黑人中文字幕一区二区三区| 欧美中文在线免费| 一区二区三区视频免费在线观看| 国产精品一区在线观看| 欧美日一区二区三区在线观看国产免| 日韩一级大片| 好吊视频一区二区三区四区| 免费看的黄色欧美网站| 久久久精品动漫| 亚洲少妇自拍| 一本色道久久99精品综合| 亚洲人成在线观看网站高清| 国产综合色在线| 欧美激情欧美狂野欧美精品| 欧美国产大片| 免费久久99精品国产| 亚洲一区二区在线免费观看| 一区二区三区成人| 欧美激情视频一区二区三区不卡| 国产在线视频不卡二| 亚洲福利视频一区二区| 午夜免费在线观看精品视频| 国产乱人伦精品一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美成人中文字幕| 欧美激情欧美激情在线五月| 亚洲欧美激情四射在线日| 欧美视频手机在线| 一区二区三区视频在线| 久久精品国产99国产精品澳门| 国产精品婷婷午夜在线观看| 久久久久久久网站| 久久精品国语| 欧美日韩一级片在线观看| 免费在线视频一区| 欧美三区美女| 日韩香蕉视频| 日韩一级免费| 欧美视频在线观看一区二区| 欧美成人亚洲成人日韩成人| 欧美va天堂在线| 日韩视频免费看| 一区二区三区不卡视频在线观看| 欧美国产精品日韩| 欧美成人免费va影院高清| 亚洲综合第一| 久久精品国产99国产精品| 久久先锋资源| 在线综合欧美| 亚洲高清视频一区| 久久婷婷久久| 亚洲三级网站| 欧美一区二区三区四区夜夜大片 | 亚洲第一福利在线观看| 免费看精品久久片| 亚洲小少妇裸体bbw| 久久久伊人欧美| 久久精品国产一区二区三| 久久夜色精品一区| 亚洲国产高清自拍| 欧美日韩精品免费| 国产精品久久久久久久久久久久| 久久久综合激的五月天| 亚洲二区在线视频| 欧美三级免费| 欧美成人自拍视频| 亚洲欧美综合精品久久成人| 女同性一区二区三区人了人一 | 久久精品国产2020观看福利| 久久激情中文| 日韩午夜在线电影| 亚洲欧美国产毛片在线| 国产欧美日本在线| 国产伦精品一区二区三区高清版| 老巨人导航500精品| 欧美成在线视频| 欧美性猛交视频| 国产精品一区二区在线观看不卡| 欧美精品在线网站| 国产精品久久久久久久久免费| 欧美国产视频一区二区| 欧美国产一区二区| 欧美多人爱爱视频网站| 欧美视频一区二区三区…| 欧美日本韩国一区二区三区| 欧美成人中文| 亚洲一二三四久久| 久久精品导航| 午夜精品久久久久| 久久免费视频在线观看| 91久久久久久| 亚洲精品一区在线观看| 亚洲福利视频网| 国产精品美腿一区在线看 | 欧美激情视频一区二区三区免费| 可以看av的网站久久看| 欧美aa在线视频| 国产精品国码视频| 国产精品久久久久久久久免费桃花 | 在线视频欧美一区| 欧美在线视频二区| 欧美精品在线看| 国产精品久99| 国语自产精品视频在线看8查询8 | 亚洲国产婷婷香蕉久久久久久| 欧美大片免费观看在线观看网站推荐| 久久黄色影院| 欧美日韩精品在线观看| 欧美婷婷久久| 亚洲欧美一区在线| 性欧美激情精品| 嫩草国产精品入口| 99国产精品久久久| 久久av老司机精品网站导航| 国产精品大全| 亚洲国产欧美一区二区三区同亚洲 | 久久精品一区二区三区不卡牛牛| 亚洲国产精品久久久久婷婷884 | 亚洲专区免费| 久久精品论坛| 亚洲国产99精品国自产| 久久成人羞羞网站| 在线播放日韩| 亚洲精品在线视频| 国产精品久久久久久模特| 亚洲精品一区二区三区婷婷月 | 国产女优一区| 欧美一区日本一区韩国一区| 国产精品黄页免费高清在线观看| 亚洲欧美日韩国产综合| 久久久久久久97| 欧美精品1区| 亚洲一区欧美激情| 一区二区久久久久久| 欧美激情亚洲视频| 欧美日韩国产美女| 欧美一区二区视频免费观看 | 亚洲欧美欧美一区二区三区| 亚洲日本激情| 亚洲欧洲久久| 99成人精品| 亚洲欧美色一区| 亚洲另类黄色|