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

posts - 297,  comments - 15,  trackbacks - 0

大家都很熟悉HTTP協(xié)議的應用,因為每天都在網(wǎng)絡上瀏覽著不少東西,也都知道是HTTP協(xié)議是相當簡單的。每次用 thunder之類的下載軟件下載網(wǎng)頁,當用到那個“用thunder下載全部鏈接”時總覺得很神奇。
后來想想,其實要實現(xiàn)這些下載功能也并不難,只要按照HTTP協(xié)議發(fā)送request,然后對接收到的數(shù)據(jù)進行分析,如果頁面上還有href之類的鏈接指 向標志就可以進行深一層的下載了。HTTP協(xié)議目前用的最多的是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;
}

/********************************************
功能:把字符串轉(zhuǎn)換為全小寫
********************************************/
void ToLowerCase(char * s) {
  while(s && *s) {*s=tolower(*s);s++;}
}

/**************************************************************
功能:從字符串src中分析出網(wǎng)站地址和端口,并得到用戶要下載的文件
***************************************************************/
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]);/*將參數(shù)轉(zhuǎn)換為全小寫*/
  printf("lowercase parameter.1 is: %s\n", argv[1]);

  GetHost(argv[1], host_addr, host_file, &portnumber);/*分析網(wǎng)址、端口、文件名等*/
  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);

  /* 客戶程序發(fā)起連接請求 */
  if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*連接網(wǎng)站*/
  {
    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,將要發(fā)送給主機*/

  /*取得真實的文件名*/
  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);

  /*發(fā)送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);
  /* 結(jié)束通訊 */
  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

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

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

posted on 2010-06-27 23:16 chatler 閱讀(1505) 評論(0)  編輯 收藏 引用 所屬分類: Network
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(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>
            亚洲无玛一区| 亚洲日本va在线观看| 亚洲理论在线| 亚洲视频高清| 亚洲精品视频在线看| 国内精品嫩模av私拍在线观看| 欧美日韩在线视频首页| 欧美久久久久久久久| 欧美丰满高潮xxxx喷水动漫| 美女久久网站| 欧美1级日本1级| 久久综合久久久久88| 久久久精品国产免大香伊| 久久国产精品久久w女人spa| 午夜在线电影亚洲一区| 欧美在线短视频| 久久久欧美一区二区| 老巨人导航500精品| 亚洲午夜影视影院在线观看| 亚洲午夜伦理| 亚洲在线视频网站| 亚洲欧美视频在线观看视频| 午夜欧美不卡精品aaaaa| 久久99伊人| 亚洲自拍三区| 午夜视频在线观看一区二区三区| 欧美一区二区三区四区在线| 午夜精品久久久久| 久久精品在线播放| 欧美丰满高潮xxxx喷水动漫| 欧美三日本三级三级在线播放| 国产精品女人网站| 国产亚洲在线观看| 亚洲精品久久视频| 91久久精品日日躁夜夜躁国产| 一区二区三区视频在线观看| 午夜精品福利在线| 美女网站久久| 一区二区成人精品| 久久久久久久久蜜桃| 久久精品99国产精品日本| 欧美国产精品日韩| 国产精品乱码妇女bbbb| 黑丝一区二区三区| 在线亚洲一区| 久久av一区二区三区漫画| 亚洲第一主播视频| 亚洲精品视频免费在线观看| 欧美一区二区观看视频| 老鸭窝毛片一区二区三区| 欧美视频在线不卡| 一区二区在线视频观看| 亚洲人成网在线播放| 中日韩美女免费视频网站在线观看| 欧美中文字幕在线播放| 亚洲伦理在线免费看| 亚洲一区二区在线看| 欧美成人免费网站| 欧美三区在线视频| 亚洲乱码国产乱码精品精| 久久噜噜亚洲综合| 亚洲欧美成人一区二区在线电影| 欧美福利视频在线观看| 亚洲福利小视频| 久久国产天堂福利天堂| 欧美激情精品久久久久久大尺度| 午夜精品久久久久久| 欧美亚日韩国产aⅴ精品中极品| 影音先锋久久| 久久网站免费| 亚洲欧美网站| 久久精品国产77777蜜臀| 国产精品v欧美精品v日本精品动漫| 亚洲国产三级| 欧美高清不卡在线| 久久婷婷成人综合色| 红桃av永久久久| 久久在线免费观看视频| 欧美一区午夜精品| 国产欧美一区二区三区国产幕精品| 亚洲一二三区视频在线观看| 老色鬼久久亚洲一区二区| 午夜国产精品视频免费体验区| 国产精品性做久久久久久| 性色av一区二区三区在线观看 | 久久国产精品一区二区| 国产精品乱子乱xxxx| 亚洲夜间福利| 在线综合亚洲欧美在线视频| 欧美久久久久久久| 亚洲视频你懂的| 亚洲一区3d动漫同人无遮挡| 在线视频欧美日韩精品| 国产精品久久久久久久久婷婷| 亚洲综合国产| 亚洲欧美视频在线观看| 尤物在线观看一区| 亚洲国产激情| 欧美丝袜一区二区| 亚洲欧美国产日韩天堂区| 一本色道久久加勒比精品| 欧美成人午夜激情在线| 欧美aⅴ99久久黑人专区| 国产精品户外野外| 久久久99精品免费观看不卡| 久久先锋资源| 在线亚洲美日韩| 欧美在线观看一区二区三区| 亚洲精品久久久久久一区二区| 亚洲午夜精品一区二区| 黄色成人免费网站| 一区二区久久| 亚洲精品一区二区三区四区高清| 亚洲一区中文字幕在线观看| 亚洲黄色在线| 欧美一区91| 亚洲综合另类| 欧美精品在线免费| 免费高清在线视频一区·| 欧美日韩亚洲一区二区三区在线| 玖玖玖国产精品| 国产精品视频99| 亚洲裸体在线观看| 亚洲国产精品一区二区尤物区| 亚洲免费一在线| 亚洲午夜在线观看视频在线| 美日韩精品视频| 久热精品在线视频| 国精产品99永久一区一区| 亚洲一线二线三线久久久| 亚洲天堂第二页| 欧美日韩国产限制| 最新亚洲激情| 一区在线观看| 欧美在线播放| 久久久久久免费| 国内精品久久久久影院色 | 欧美性猛交xxxx乱大交蜜桃| 欧美激情一区二区| 亚洲国产精品综合| 欧美gay视频| 最新亚洲视频| 亚洲线精品一区二区三区八戒| 欧美日韩网址| 中文在线资源观看视频网站免费不卡| 99在线热播精品免费| 欧美日韩国产小视频在线观看| 亚洲美女精品成人在线视频| 亚洲视屏在线播放| 国产免费成人| 久久久久**毛片大全| 欧美jizz19性欧美| 亚洲精品午夜精品| 欧美日本久久| 亚洲免费中文| 毛片av中文字幕一区二区| 亚洲福利在线看| 欧美日韩精品一区二区三区| 亚洲免费在线观看| 免费亚洲视频| 亚洲一二三四区| 国产一区二区三区自拍| 久久在线免费观看视频| 亚洲精品在线二区| 久久国产精品99精品国产| 在线成人免费视频| 欧美激情国产精品| 亚洲一区二区黄色| 狠狠色狠狠色综合系列| 欧美激情91| 亚洲永久精品大片| 欧美国产日本| 午夜精品视频在线观看| 亚洲国产精品va在看黑人| 欧美日韩亚洲系列| 欧美在线免费播放| 亚洲每日更新| 麻豆精品91| 亚洲一区二区三区免费在线观看 | 欧美激情精品久久久久久黑人| 亚洲午夜女主播在线直播| 一区在线电影| 国产精品一区二区在线观看| 久久综合影视| 西西裸体人体做爰大胆久久久| 亚洲大黄网站| 久久久欧美精品sm网站| 亚洲一区二区精品视频| 亚洲高清不卡| 国产一区二区观看| 国产精品欧美日韩久久| 蜜臀av一级做a爰片久久| 性欧美大战久久久久久久久| 亚洲日韩中文字幕在线播放| 久久综合国产精品| 欧美中文字幕视频| 亚洲在线国产日韩欧美| 亚洲伦伦在线| 亚洲人成人99网站| 亚洲国产精品久久久久秋霞影院|