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

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 閱讀(1513) 評論(0)  編輯 收藏 引用 所屬分類: Network
<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用鏈接

留言簿(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>
            国产精品久久久久av免费| 国产欧美精品一区二区三区介绍| 国产亚洲亚洲| 久久久久久欧美| 欧美一区二区精品在线| 国产女主播一区二区| 久久免费高清视频| 久久久久久一区二区| 国产综合网站| 你懂的视频欧美| 欧美激情综合在线| 亚洲永久网站| 午夜精品区一区二区三| 国产伦精品免费视频| 久久精品国产清高在天天线| 久久国产精品久久久久久久久久| 在线看视频不卡| 亚洲美女毛片| 国产婷婷色一区二区三区在线| 欧美一区二区三区四区视频| 性欧美暴力猛交另类hd| 亚洲福利视频网站| 亚洲人成毛片在线播放女女| 国产精品www色诱视频| 久久精品国产成人| 欧美 日韩 国产在线| 一区二区欧美在线观看| 西瓜成人精品人成网站| 亚洲第一在线| 亚洲专区一区二区三区| 亚洲国产小视频| 亚洲欧美日韩专区| 9久re热视频在线精品| 欧美在线91| 亚洲桃花岛网站| 久久久久久亚洲精品中文字幕 | 欧美不卡高清| 香蕉久久夜色精品国产使用方法 | 在线视频免费在线观看一区二区| 狠狠色香婷婷久久亚洲精品| 99ri日韩精品视频| 亚洲国产精品久久久久秋霞蜜臀| 亚洲午夜精品一区二区三区他趣| 亚洲欧洲精品一区二区三区不卡| 亚洲午夜日本在线观看| 99精品欧美一区二区三区综合在线| 亚洲欧美日韩区| 亚洲亚洲精品在线观看| 欧美高清不卡在线| 久久一区二区三区四区| 国产美女精品一区二区三区| 日韩图片一区| av不卡免费看| 欧美精品激情在线观看| 美女日韩在线中文字幕| 国产一区二区三区高清在线观看| 国产精品99久久不卡二区| 亚洲每日更新| 欧美激情一区二区三级高清视频 | 99视频热这里只有精品免费| 久久久久成人精品| 久久精品视频在线免费观看| 欧美午夜片在线观看| 91久久精品国产91久久| 亚洲黄色天堂| 久久一区二区三区av| 久久综合999| 国外成人在线视频网站| 久久久久久9| 欧美国产欧美综合 | 在线国产欧美| 久久久久www| 欧美成人tv| 91久久精品国产| 欧美高清视频一区| 亚洲国产综合在线| 国产精品99久久久久久久女警| 欧美久久99| 正在播放亚洲一区| 午夜久久tv| 精品盗摄一区二区三区| 免费成人高清视频| 亚洲日韩欧美视频一区| 亚洲欧美国产高清| 国产日韩专区在线| 麻豆精品91| 一本色道久久综合精品竹菊| 午夜精品一区二区在线观看| 国产亚洲亚洲| 欧美精品七区| 亚洲一区三区电影在线观看| 久久久久久成人| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩亚洲一区二| 亚洲欧美日韩国产成人| 欧美大片18| 午夜精品www| 国产毛片精品国产一区二区三区| 久久狠狠亚洲综合| 亚洲精品乱码久久久久久按摩观| 亚洲免费综合| 亚洲丁香婷深爱综合| 国产精品成av人在线视午夜片| 久久精品国产免费| 亚洲精品一区二区三区四区高清| 久久国产主播精品| 日韩一区二区久久| 国内精品久久久| 欧美三级视频| 美女图片一区二区| 亚洲一区在线观看免费观看电影高清| 久久亚洲欧美国产精品乐播| 在线综合视频| 亚洲国产毛片完整版| 国产欧美日韩视频| 欧美日韩另类综合| 久久久久久久一区二区| 99伊人成综合| 蜜臀av一级做a爰片久久| 亚洲欧美美女| 99re66热这里只有精品4 | 久久国产日韩欧美| 一区二区三区精品在线| 亚洲第一偷拍| 免费成人黄色av| 久久福利一区| 亚洲欧美一区二区激情| 日韩视频在线你懂得| 亚洲国产成人高清精品| 国产一区日韩一区| 国产精品白丝av嫩草影院| 欧美激情1区2区| 久久人人97超碰国产公开结果| 亚洲日本中文| 午夜精品亚洲| 亚洲二区在线| 欧美激情二区三区| 国产精品色网| 欧美日韩国产a| 欧美成人免费在线观看| 性久久久久久久久| 亚洲欧美一区二区三区久久| 欧美成人精品| 模特精品裸拍一区| 久久尤物电影视频在线观看| 久久精品官网| 久久久久久穴| 看欧美日韩国产| 久久频这里精品99香蕉| 久久精品一区中文字幕| 久久久人成影片一区二区三区| 久久成人精品| 久久米奇亚洲| 免费视频一区| 亚洲国产欧美久久| 亚洲成人资源| 亚洲高清网站| 欧美 日韩 国产在线| 蜜桃伊人久久| 亚洲第一色在线| 99精品国产高清一区二区| 一片黄亚洲嫩模| 小嫩嫩精品导航| 久久久综合网站| 欧美老女人xx| 国产精品欧美日韩一区| 国产一区欧美日韩| 亚洲国产美女| 一区二区不卡在线视频 午夜欧美不卡'| 9国产精品视频| 欧美亚洲在线播放| 蜜臀久久久99精品久久久久久 | 羞羞视频在线观看欧美| 欧美专区日韩专区| 久久久天天操| 亚洲国产综合视频在线观看| 一区二区三区精品视频| 亚洲欧美三级在线| 免费日韩av| 国产老肥熟一区二区三区| 一区二区三区在线观看国产| 一色屋精品亚洲香蕉网站| 一本色道久久88综合日韩精品| 午夜精品成人在线视频| 欧美肥婆在线| 亚洲影院高清在线| 免费久久精品视频| 国产精品亚洲激情| 亚洲精品久久在线| 久久精品视频免费| 99国产精品久久久久久久| 欧美一区二区三区的| 欧美日韩在线观看一区二区| 国产精品综合久久久| 日韩视频在线一区二区三区| 久久久之久亚州精品露出| 亚洲精品资源| 久久另类ts人妖一区二区| 国产伦精品一区二区三区高清版 | 国产亚洲欧美一区在线观看|