现在的位置: 首页 > 综合 > 正文

老爸与web服务之我对http请求的理解

2017年07月10日 ⁄ 综合 ⁄ 共 2012字 ⁄ 字号 评论关闭

前面写了一篇博客是用java实现http请求。在这之前也曾经用c写过http的请求。

http协议是建立在tcp协议基础之上的协议。OK,用C的socket连接到apache服务,本机apache占80端口已启动


#include<sys/types.h>
#include<string.h>

#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<unistd.h>

int main(){
  int sockfd;
  struct sockaddr_in addr;
  int PORT = 80;//apache工作中80端口
  char IP[]="127.0.0.1";//本机IP地址

  if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
    perror("socket..\n");
    exit(1);
  }

  bzero(&addr,sizeof(addr));
  //设置服务器的IP地址和端口号。
  addr.sin_family=AF_INET;
  addr.sin_port=htons(PORT);
  addr.sin_addr.s_addr=inet_addr(IP);

  if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0){
    perror("connect..\n");
  }

  char str1[1024];
  
  int buf=0;
  memset(str1,'\0',sizeof(str1));  
  //我在这儿等着你的回应,等着你的回应
  buf=read(sockfd,str1,1020);

  str1[buf]='\0';
  printf("%s",str1);
  close(sockfd);
  return 0;
}

等死也没有等到我想要的结果,甚至连一个字符也没读取到。查阅资料才知道原来http虽然是建立在tcp协议之上,但是需要在数据的首部加上一些信息。而这些信息就是告诉服务器我想要干什么

我上大学的时候很少给家里打电话,每次打电话就是跟老爸要钱,内容也很简单一般不超过三分钟。上面的程序就好像是我给老爸打过电话后,我什么也不说。然后就等着老爸给我打钱了(老爸当然知道我想要钱了,但是老爸想你不说要钱,我就不给你打。呵呵。可是对于服务器你如果不告诉它你想要干什么,它是无法猜测的)。直到等到有一天我实在无法忍受,终于再次拨老爸的号码(给我打钱吧。知道了,明天再给你打吧)。

#include<sys/types.h>
#include<string.h>

#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<unistd.h>

int main(){
  int sockfd;
  struct sockaddr_in addr;
  int PORT = 80;//apache工作中80端口
  char IP[]="127.0.0.1";//本机IP地址

  if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
    perror("socket..\n");
    exit(1);
  }

  bzero(&addr,sizeof(addr));
  //设置服务器的IP地址和端口号。
  addr.sin_family=AF_INET;
  addr.sin_port=htons(PORT);
  addr.sin_addr.s_addr=inet_addr(IP);

  if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0){
    perror("connect..\n");
  }

  char str1[1024];
  
  int buf=0;
  memset(str1,'\0',sizeof(str1));  
  
  strcat(str1,"GET /myweb/style.html HTTP/1.1\r\n");
  strcat(str1,"HOST:127.0.0.1\r\n");
  strcat(str1,"\r\n");
  int n=strlen(str1);
  write(sockfd,str1,n);
  //^_^
  buf=read(sockfd,str1,1020);

  str1[buf]='\0';
  printf("%s",str1);
  close(sockfd);
  return 0;
}

中间增加的代码就是http的请求头部信息,其作用相当于电话打通后“老爸给我打钱"。如果第二个程序中将write(sockfd,str1,n)与buf=read(sockfd,str1,1020)两行进行交换,其功能是先从服务器上读取信息,然后再向服务器发请求(老爸先给我打钱,然后我再给老爸打电话要钱。)

抱歉!评论已关闭.