Linux下HTTP Server
想在Linux下实现一个简单的web Server并不难。一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回送数据。在大多是情况下,(GET、POST命令),服务求回传给客户端的都是文件(HTML 文档, 图片,JavaScript脚本等等)。
下面是一个极简单的HTTP Server的demo,虽然只处理GET请求并发送单一文件,但基本展示了web server的框架。我的例子试图将功能和结构做到最精简,这样,一个http server的基本结构,便一目了然。
- #include<sys/socket.h>
- #include<errno.h>
- #include<netinet/in.h>
- #include<string.h>
- #include<stdio.h>
- #define BUF_LEN 1028
- #define SERVER_PORT 8080
- //定义好的html页面,实际情况下web server基本是从本地文件系统读取html文件
- const static char http_error_hdr[] = "HTTP/1.1 404 Not Found\r\nContent-type: text/html\r\n\r\n";
- const static char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
- const static char http_index_html[] =
- "<html><head><title>Congrats!</title></head>"
- "<body><h1>Welcome to our HTTP server demo!</h1>"
- "<p>This is a just small test page.</body></html>";
- //解析到HTTP请求的文件后,发送本地文件系统中的文件
- //这里,我们处理对index文件的请求,发送我们预定好的html文件
- //呵呵,一切从简!
- int http_send_file(char *filename, int sockfd)
- {
- if(!strcmp(filename, "/")){
- //通过write函数发送http响应报文;报文包括HTTP响应头和响应内容--HTML文件
- write(sockfd, http_html_hdr, strlen(http_html_hdr));
- write(sockfd, http_index_html, strlen(http_index_html));
- }
- else{
- // 文件未找到情况下发送404error响应
- printf("%s:file not find!\n",filename);
- write(sockfd, http_error_hdr, strlen(http_error_hdr));
- }
- return 0;
- }
- //HTTP请求解析
- void serve(int sockfd){
- char buf[BUF_LEN];
- read(sockfd, buf, BUF_LEN);
- if(!strncmp(buf, "GET", 3)){
- char *file = buf + 4;
- char *space = strchr(file, ' ');
- *space = '\0';
- http_send_file(file, sockfd);
- }
- else{
- //其他HTTP请求处理,如POST,HEAD等 。这里我们只处理GET
- printf("unsupported request!\n");
- return;
- }
- }
- void main(){
- int sockfd,err,newfd;
- struct sockaddr_in addr;
- //建立TCP套接字
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if(sockfd < 0){
- perror("socket creation failed!\n");
- return;
- }
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- //这里要注意,端口号一定要使用htons先转化为网络字节序,否则绑定的实际端口
- //可能和你需要的不同
- addr.sin_port = htons(SERVER_PORT);
- addr.sin_addr.s_addr = INADDR_ANY;
- if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
- perror("socket binding failed!\n");
- return;
- }
- listen(sockfd, 128);
- for(;;){
- //不间断接收HTTP请求并处理,这里使用单线程,在实际情况下考虑到效率一般多线程
- newfd = accept(sockfd, NULL, NULL);
- serve(newfd);
- close(newfd);
- }
- }
转载于:https://www.cnblogs.com/daochong/p/6928576.html
Linux下HTTP Server相关推荐
- 启动mq命令 linux,RocketMQ:Linux下启动server和broker的命令
目录 QUESTION:RocketMQ:Linux下启动server和broker的命令? ANSWER: 一.启动mqnamesrv 1.1当前执行 1.2后台运行 二.启动mqbroker 2. ...
- RocketMQ:Linux下启动server和broker的命令
目录 QUESTION:RocketMQ:Linux下启动server和broker的命令? ANSWER: 一.启动mqnamesrv 1.1当前执行 1.2后台运行 二.启动mqbroker 2. ...
- Linux 下判断Server 内存是否不足
2019独角兽企业重金招聘Python工程师标准>>> 下面我来写一下在linux OS 下如何判断系统是否内存吃紧. 我从两个部分来查看如何检查. 第一部分:查看内存使用状况 Li ...
- 查看linux内存存储空间不足,Linux 下判断Server 内存是否不足
下面我来写一下在linux OS 下如何判断系统是否内存吃紧. 我从两个部分来查看如何检查. 第一部分:查看内存使用状况 Linux 下使用Top [root@itc-test9 ~]# top to ...
- CentOS Linux下VNC Server远程桌面配置详解
PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较完整的.下面的配置在CentOS5.x和6.x.SUSE企业 ...
- centos linux下vnc server远程桌面配置详解,CentOS 6.0 VNC远程桌面配置
引言: 必须明白: vncserver在调用的时候,会根据你的配置来启用server端的监听端口, 端口默认是从5900开始,再加上你的桌面号. 比如你的桌面号为1,则vnc的连接端口号为5900+1 ...
- VNC CentOS Linux下VNC Server远程桌面配置详解
VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...
- Linux下MySQL server和client安装
一.安装方法 安装MySQL主要有两种方法:一种是通过源代码进行编译安装,适合高级用户自己定制MySQL的特性:另一种比较简单的是使用已经编译过的二进制文件进行安装.二进制文件安装又分为不针对特定平台 ...
- 解决Linux下ArcGIS Server的Tomcat不稳定问题,nginx配置反向代理时的一个小问题
背景:Linux上的ArcGIS Server的Tomcat进程基本上一天崩溃一次,全天在处理rest请求,压力较大.而SOM与SOC压力较小 解决方案:使用多个Web Service,加入另一台ng ...
最新文章
- .net中窗体之间的数据交换总结
- python捷豹_图像处理基本工具——Python 环境下的 Pillow( PIL )
- Oracle日期转换为周,月,季度,半年,年
- 通向成功的23个方法
- Ruby 和 Python 分析器是如何工作的?
- CUDA内存分配、释放、传输,固定内存
- 算法笔记2-优先队列(堆)(上)
- PLC编程语言都在这里了!
- VS2010 SP1 编译QT4.8.0 x64版本
- 我国iPS细胞事业支援促进委员会成立
- Win10 默认输入变全角问题解决方法
- DZ先生怪谈国标之云台控制流程
- postgresql兼容MySQL on update current_timestamp
- Linux之企业实训篇——haproxy与pacemaker实现高可用负载均衡
- 程序逸的Java项目之旅-图书管理系统之数据库设计(1)
- GSoC 2022 Blender VSE: 第二、三周总结
- java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-
- WindowsXP/7/10 Python3.6.3开发环境配置图文教程
- 中年人学C语言Windows程序设计,30 DialogBox控件
- 不同的工具包对Voxel-based morphometry (VBM)计算结果的影响
热门文章
- 【转】如何在Qt 4程序中优化布局结构-兼回答网友提问
- 毕设日志——Linux软连接的建立与删除
- 解决sublime text3 v3.1.1,Build3176中的汉字形状扭曲问题
- memcached一致性哈希及php客户端实现
- IntelliJ IDEA配置与搭建web项目入门使用
- mysql慢查询分析工具和分析方法
- 流程多节点调用同一张业务表单的锚点问题
- 11.11.17 start L3
- vs2005配置c语言连接mysql
- 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL