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

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 閱讀(1504) 評論(0)  編輯 收藏 引用 所屬分類: Network
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
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>
            一区二区三区视频观看| 国产精品美女久久福利网站| 国产噜噜噜噜噜久久久久久久久| 欧美激情aⅴ一区二区三区| 国产精品视频yy9099| 一本色道久久综合亚洲精品按摩| 亚洲成人资源| 久久久久99| 久久亚洲精品视频| 国产三级欧美三级| 午夜国产一区| 亚洲欧美日韩在线不卡| 国产精品v片在线观看不卡| 亚洲精品在线观看视频| 亚洲毛片在线| 欧美+亚洲+精品+三区| 久久精品国产精品| 亚洲精品免费一二三区| 国产精品亚洲综合天堂夜夜| 国产欧美日韩亚洲一区二区三区| 日韩午夜在线电影| 樱花yy私人影院亚洲| 亚洲欧美日韩区| 亚洲精品社区| 99国产精品久久久久久久成人热| 夜夜狂射影院欧美极品| 国产精品区免费视频| 国产精品福利av| 欧美成人在线免费视频| 欧美一区1区三区3区公司| 久久综合五月天婷婷伊人| 亚洲私人黄色宅男| 国产日韩欧美三级| 国产在线视频欧美一区二区三区| 欧美日韩第一区日日骚| 亚洲女爱视频在线| 亚洲精品影院| 性久久久久久久久久久久| 这里只有精品丝袜| 欧美一区二区三区免费看| 国产精品久久久久久久午夜片| 日韩亚洲国产欧美| 亚洲福利视频在线| 欧美激情久久久| 美女网站在线免费欧美精品| 亚洲欧美另类综合偷拍| 久久中文字幕一区| 一本色道久久综合亚洲精品婷婷| 久久xxxx精品视频| 在线一区亚洲| 午夜久久久久久| 亚洲欧美日韩高清| 欧美国产第二页| 一区二区日韩欧美| 毛片一区二区| 亚洲一区国产一区| 免费中文字幕日韩欧美| 欧美1级日本1级| 欧美一级片久久久久久久| 国产精品久久久久久久久动漫| 亚洲国产欧美精品| 欧美色区777第一页| 欧美成人亚洲成人日韩成人| 国产一区99| 美女国内精品自产拍在线播放| 亚洲国产乱码最新视频| 欧美激情一区二区三区在线视频观看 | 亚洲激情视频网| 美女91精品| 欧美诱惑福利视频| 亚洲精品三级| 男女激情视频一区| 久久免费99精品久久久久久| 久久久青草婷婷精品综合日韩 | 国产精品白丝av嫩草影院| 亚洲精品日韩综合观看成人91| 欧美激情女人20p| 欧美日韩国产美| 欧美一区二区久久久| 午夜在线精品偷拍| 亚洲国产精品va在线观看黑人| 亚洲精品日韩综合观看成人91| 久久综合伊人77777蜜臀| 久久精品视频va| 亚洲电影下载| 欧美日韩福利| 蜜臀va亚洲va欧美va天堂| 欧美涩涩网站| 欧美一区二区三区在线免费观看| 亚洲欧美日韩综合aⅴ视频| 国产午夜精品视频免费不卡69堂| 久久中文欧美| 欧美日韩一区三区四区| 影音先锋中文字幕一区二区| 女人色偷偷aa久久天堂| 欧美电影资源| 欧美一区二区在线播放| 久久精品视频在线播放| 日韩视频精品在线| 亚洲欧美日韩一区在线观看| 亚洲国产婷婷综合在线精品 | 亚洲区欧美区| 久久国产精品黑丝| 亚洲免费大片| 欧美在线视频观看免费网站| 亚洲精品一区二| 午夜免费在线观看精品视频| 亚洲精品免费一二三区| 亚洲欧美国产高清| 99re8这里有精品热视频免费| 欧美怡红院视频| 亚洲一区欧美激情| 一本久久综合亚洲鲁鲁五月天| 国产原创一区二区| 亚洲视频一二三| 国产精品一区二区三区观看| 欧美电影电视剧在线观看| 国产精品高潮视频| 欧美激情欧美狂野欧美精品| 国产亚洲美州欧州综合国| 日韩亚洲精品在线| 日韩一区二区免费高清| 久久不射网站| 欧美资源在线| 欧美一区午夜精品| 亚洲天堂av在线免费| 欧美高清视频一区二区| 亚洲精品欧美| 另类综合日韩欧美亚洲| 午夜精品久久久| 亚洲尤物视频网| 欧美精品一区二区三区久久久竹菊 | 亚洲天堂视频在线观看| 国产精品一区视频| 亚洲毛片一区| 99视频精品| 欧美人与性动交a欧美精品| 欧美激情视频网站| 亚洲国产欧美在线| 免费h精品视频在线播放| 男女精品网站| 亚洲麻豆av| 欧美aa在线视频| 欧美激情在线有限公司| 亚洲国产精品一区二区www在线 | 亚洲国产精品国自产拍av秋霞| 欧美成人免费全部| 免费久久99精品国产| 在线观看欧美成人| 麻豆精品网站| 亚洲日本在线观看| 亚洲性xxxx| 久久野战av| 欧美国产精品va在线观看| 亚洲激情黄色| 欧美日韩欧美一区二区| 亚洲性夜色噜噜噜7777| 欧美一级大片在线观看| 欧美成人自拍| 亚洲免费av电影| 欧美怡红院视频一区二区三区| 国产亚洲一区在线| 久久尤物电影视频在线观看| 亚洲天堂偷拍| 国产精品欧美在线| 久久米奇亚洲| 一本大道久久a久久精二百| 欧美一区永久视频免费观看| 一区在线免费| 亚洲综合色激情五月| 久久精品人人做人人爽| 在线电影院国产精品| 欧美日韩影院| 久久天天躁狠狠躁夜夜av| 亚洲精品中文字幕在线| 久久久久久亚洲精品中文字幕| 欧美激情小视频| 久久久久国色av免费看影院| 欧美精品三级日韩久久| 亚洲午夜视频在线| 欧美jizz19hd性欧美| 亚洲一区网站| 亚洲欧洲日韩在线| 久久青青草综合| 99视频精品免费观看| 久久视频这里只有精品| 亚洲视频观看| 亚洲电影免费观看高清完整版| 欧美美女bbbb| 麻豆成人在线观看| 久久国产精品黑丝| 午夜电影亚洲| 在线视频欧美一区| 欧美激情欧美激情在线五月| 欧美一区二区视频免费观看| 欧美在线免费观看视频| 亚洲国产99精品国自产| 国产视频一区在线| 欧美日韩一区二区三区高清| 美女黄色成人网|