前面写了一篇博客是用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)两行进行交换,其功能是先从服务器上读取信息,然后再向服务器发请求(老爸先给我打钱,然后我再给老爸打电话要钱。)