http协议学习以及简单应用服务器编写
2016-01-05 16:48
363 查看
最近重新学习了一下http协议的基本原理,为什么叫重新学习呢,因为平时我们一直在用到http协议的各种应用软件以及思想,就像在浏览器地址栏敲入一个URL并按回车时,比如这样https://www.baidu.com/,在你按下回车之后就是给服务器发送了一个连接请求,然后服务器就会根据你要求的IP和端口号返回给你相应的内容,上面的URL看起来可能不太明显,再比如这个http://115.28.26.84:4603/,在地址栏输入这个就相当于我要访问IP地址为115.28.26.84的服务器且端口号为4603,如果这时候服务器处于打开状态的话,你按回车之后就会在浏览器显示相应的内容。下面给出一个最简单的应用服务器实现代码:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<string.h>
#include<arpa/inet.h>
int main()
{
int
server_fd,client_fd;
struct
sockaddr_in myaddr;
struct
sockaddr_in clientaddr;
int
client_len=sizeof(clientaddr);
char
content[]="<html><h1>hello songmengke</h1></html>";
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(80);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
perror("socket
error");
if(bind(server_fd,(struct
sockaddr *)&myaddr,sizeof(myaddr))==-1)
perror("bind
error");
if(listen(server_fd,20)==-1)
perror("listen
error");
while(1)
{
client_fd=accept(server_fd,(struct
sockaddr *)&clientaddr,&client_len);
if(client_fd==-1)
perror("accept
error");
printf("accept\n");
send(client_fd,content,sizeof(content),0);
close(client_fd);
}
close(server_fd);
}
这个服务器是运行在linux系统上面的,用一个死循环来接受客户端的请求,只要在浏览器地址栏键入http://115.28.26.84:80/就能在浏览器中看到hello
songmengke的字样,如果你服务器运行的是windows操作系统,代码会有很大不同,不过原理都是一样的,绑定端口,监听端口,发送请求,只不过使用的函数名称不太一样,参数数目不太一样而已。
现在看到这段代码是不是觉得自己写一个服务器引擎其实也不是那么难呢,根据这个基础,你可以扩展一下,当在地址栏输入地址之后返回一个网页然后浏览器解析,也可以用多线程来改善服务器程序效率,当你具备了这些知识之后,写一个Apache那样的服务器引擎也不是不可能,只不过要加非常多而复杂的功能,所以,计算机领域的知识是学不完的,欢迎看到博客的读者拍砖~
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<string.h>
#include<arpa/inet.h>
int main()
{
int
server_fd,client_fd;
struct
sockaddr_in myaddr;
struct
sockaddr_in clientaddr;
int
client_len=sizeof(clientaddr);
char
content[]="<html><h1>hello songmengke</h1></html>";
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(80);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
perror("socket
error");
if(bind(server_fd,(struct
sockaddr *)&myaddr,sizeof(myaddr))==-1)
perror("bind
error");
if(listen(server_fd,20)==-1)
perror("listen
error");
while(1)
{
client_fd=accept(server_fd,(struct
sockaddr *)&clientaddr,&client_len);
if(client_fd==-1)
perror("accept
error");
printf("accept\n");
send(client_fd,content,sizeof(content),0);
close(client_fd);
}
close(server_fd);
}
这个服务器是运行在linux系统上面的,用一个死循环来接受客户端的请求,只要在浏览器地址栏键入http://115.28.26.84:80/就能在浏览器中看到hello
songmengke的字样,如果你服务器运行的是windows操作系统,代码会有很大不同,不过原理都是一样的,绑定端口,监听端口,发送请求,只不过使用的函数名称不太一样,参数数目不太一样而已。
现在看到这段代码是不是觉得自己写一个服务器引擎其实也不是那么难呢,根据这个基础,你可以扩展一下,当在地址栏输入地址之后返回一个网页然后浏览器解析,也可以用多线程来改善服务器程序效率,当你具备了这些知识之后,写一个Apache那样的服务器引擎也不是不可能,只不过要加非常多而复杂的功能,所以,计算机领域的知识是学不完的,欢迎看到博客的读者拍砖~
相关文章推荐