目的:在centOS7中,打开网页,并在地址栏输入:http://localhost:8500/?aaa=7&&bbb=8 , 然后在自己写得socket中收到这些数据,并把一个test.txt文件中的内容发送到网页上去。
第一步:在centos7的linux下新建一个目录: 比如是 /home/jintingbo/c/lianxi;
第二步:将win10下编辑好的test.txt文件传到linux的 /home/jintingbo/c/lianxi 下;
第三步:用vi在/home/jintingbo/c/lianxi/ 下编辑一个 mys_http_get_xiangying.c文件,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<sys/fcntl.h>
#define PORT 8500//端口号
#define BACKLOG 5/*最大监听数*/
int main(){
int sockfd,new_fd;/*socket句柄和建立连接后的句柄*/
struct sockaddr_in my_addr;/*本方地址信息结构体,下面有具体的属性赋值*/
struct sockaddr_in their_addr;/*对方地址信息*/
socklen_t sin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(sockfd==-1){
printf("socket failed:%d",errno);
return -1;
}
my_addr.sin_family=AF_INET;/*该属性表示接收本机或其他机器传输*/
my_addr.sin_port=htons(PORT);/*端口号*/
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括号内容表示本机IP*/
bzero(&(my_addr.sin_zero),8);/*将其他属性置0*/
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){//绑定地址结构体和socket
printf("bind error");
return -1;
}
listen(sockfd,BACKLOG);//开启监听 ,第二个参数是最大监听数
while(1){
sin_size=sizeof(struct sockaddr_in);
new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小
if(new_fd==-1){
printf("receive failed");
} else{
char request[1024];
recv(new_fd,request,1024,0);
request[strlen(request)+1]='\0';
printf("%s\n",request);
printf("successeful!\n");
char buf[520]="HTTP/1.1 200 ok\r\nconnection: close\r\n\r\n";//HTTP响应
int s = send(new_fd,buf,strlen(buf),0);//发送响应
//printf("send=%d\n",s);
int f1 = open("test.txt",O_RDONLY);//消息体
sendfile(new_fd,f1,NULL,2500);//零拷贝发送消息体
close(f1);
close(new_fd);
}
}
return 0;
}
第四步: 用 gcc mys_http_get_xiangying.c -o mys_http_get_xiangying 命令编译这个C程序后就会得到 mys_http_get_xiangying这个程序。
第五步:用 ./mys_http_get_xiangying 运行这个程序, 如果提示权限不够,就用chmod对它的权限进行修改。
第六步:运行后没有反应是正常的,表示它正处于监听状态。
第七步: 在centos7中打开firfox浏览器,在地址栏输入: http://localhost:8500/?aaa=7&&bbb=8 回车后,会在./mys_http_get_xiangying 运行的终端,会看到这个c语言的socket接收到的数据:
实验完毕。
本例所需要的知识点:1.C语言socket编程;2.http协议 中的响应格式。