想在Linux下实现一个简单的web Server并不难。一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回送数据。在大多是情况下,(GET、POST命令),服务求回传给客户端的都是文件(HTML 文档, 图片,JavaScript脚本等等)。

下面是一个极简单的HTTP Server的demo,虽然只处理GET请求并发送单一文件,但基本展示了web server的框架。我的例子试图将功能和结构做到最精简,这样,一个http server的基本结构,便一目了然。

[cpp] view plaincopy
  1. #include<sys/socket.h>
  2. #include<errno.h>
  3. #include<netinet/in.h>
  4. #include<string.h>
  5. #include<stdio.h>
  6. #define BUF_LEN 1028
  7. #define SERVER_PORT 8080
  8. //定义好的html页面,实际情况下web server基本是从本地文件系统读取html文件
  9. const static char http_error_hdr[] = "HTTP/1.1 404 Not Found\r\nContent-type: text/html\r\n\r\n";
  10. const static char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
  11. const static char http_index_html[] =
  12. "<html><head><title>Congrats!</title></head>"
  13. "<body><h1>Welcome to our HTTP server demo!</h1>"
  14. "<p>This is a just small test page.</body></html>";
  15. //解析到HTTP请求的文件后,发送本地文件系统中的文件
  16. //这里,我们处理对index文件的请求,发送我们预定好的html文件
  17. //呵呵,一切从简!
  18. int http_send_file(char *filename, int sockfd)
  19. {
  20. if(!strcmp(filename, "/")){
  21. //通过write函数发送http响应报文;报文包括HTTP响应头和响应内容--HTML文件
  22. write(sockfd, http_html_hdr, strlen(http_html_hdr));
  23. write(sockfd, http_index_html, strlen(http_index_html));
  24. }
  25. else{
  26. // 文件未找到情况下发送404error响应
  27. printf("%s:file not find!\n",filename);
  28. write(sockfd, http_error_hdr, strlen(http_error_hdr));
  29. }
  30. return 0;
  31. }
  32. //HTTP请求解析
  33. void serve(int sockfd){
  34. char buf[BUF_LEN];
  35. read(sockfd, buf, BUF_LEN);
  36. if(!strncmp(buf, "GET", 3)){
  37. char *file = buf + 4;
  38. char *space = strchr(file, ' ');
  39. *space = '\0';
  40. http_send_file(file, sockfd);
  41. }
  42. else{
  43. //其他HTTP请求处理,如POST,HEAD等 。这里我们只处理GET
  44. printf("unsupported request!\n");
  45. return;
  46. }
  47. }
  48. void main(){
  49. int sockfd,err,newfd;
  50. struct sockaddr_in addr;
  51. //建立TCP套接字
  52. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  53. if(sockfd < 0){
  54. perror("socket creation failed!\n");
  55. return;
  56. }
  57. memset(&addr, 0, sizeof(addr));
  58. addr.sin_family = AF_INET;
  59. //这里要注意,端口号一定要使用htons先转化为网络字节序,否则绑定的实际端口
  60. //可能和你需要的不同
  61. addr.sin_port = htons(SERVER_PORT);
  62. addr.sin_addr.s_addr = INADDR_ANY;
  63. if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
  64. perror("socket binding failed!\n");
  65. return;
  66. }
  67. listen(sockfd, 128);
  68. for(;;){
  69. //不间断接收HTTP请求并处理,这里使用单线程,在实际情况下考虑到效率一般多线程
  70. newfd = accept(sockfd, NULL, NULL);
  71. serve(newfd);
  72. close(newfd);
  73. }
  74. }

转载于:https://www.cnblogs.com/daochong/p/6928576.html

Linux下HTTP Server相关推荐

  1. 启动mq命令 linux,RocketMQ:Linux下启动server和broker的命令

    目录 QUESTION:RocketMQ:Linux下启动server和broker的命令? ANSWER: 一.启动mqnamesrv 1.1当前执行 1.2后台运行 二.启动mqbroker 2. ...

  2. RocketMQ:Linux下启动server和broker的命令

    目录 QUESTION:RocketMQ:Linux下启动server和broker的命令? ANSWER: 一.启动mqnamesrv 1.1当前执行 1.2后台运行 二.启动mqbroker 2. ...

  3. Linux 下判断Server 内存是否不足

    2019独角兽企业重金招聘Python工程师标准>>> 下面我来写一下在linux OS 下如何判断系统是否内存吃紧. 我从两个部分来查看如何检查. 第一部分:查看内存使用状况 Li ...

  4. 查看linux内存存储空间不足,Linux 下判断Server 内存是否不足

    下面我来写一下在linux OS 下如何判断系统是否内存吃紧. 我从两个部分来查看如何检查. 第一部分:查看内存使用状况 Linux 下使用Top [root@itc-test9 ~]# top to ...

  5. CentOS Linux下VNC Server远程桌面配置详解

    PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较完整的.下面的配置在CentOS5.x和6.x.SUSE企业 ...

  6. centos linux下vnc server远程桌面配置详解,CentOS 6.0 VNC远程桌面配置

    引言: 必须明白: vncserver在调用的时候,会根据你的配置来启用server端的监听端口, 端口默认是从5900开始,再加上你的桌面号. 比如你的桌面号为1,则vnc的连接端口号为5900+1 ...

  7. VNC CentOS Linux下VNC Server远程桌面配置详解

    VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...

  8. Linux下MySQL server和client安装

    一.安装方法 安装MySQL主要有两种方法:一种是通过源代码进行编译安装,适合高级用户自己定制MySQL的特性:另一种比较简单的是使用已经编译过的二进制文件进行安装.二进制文件安装又分为不针对特定平台 ...

  9. 解决Linux下ArcGIS Server的Tomcat不稳定问题,nginx配置反向代理时的一个小问题

    背景:Linux上的ArcGIS Server的Tomcat进程基本上一天崩溃一次,全天在处理rest请求,压力较大.而SOM与SOC压力较小 解决方案:使用多个Web Service,加入另一台ng ...

最新文章

  1. .net中窗体之间的数据交换总结
  2. python捷豹_图像处理基本工具——Python 环境下的 Pillow( PIL )
  3. Oracle日期转换为周,月,季度,半年,年
  4. 通向成功的23个方法
  5. Ruby 和 Python 分析器是如何工作的?
  6. CUDA内存分配、释放、传输,固定内存
  7. 算法笔记2-优先队列(堆)(上)
  8. PLC编程语言都在这里了!
  9. VS2010 SP1 编译QT4.8.0 x64版本
  10. 我国iPS细胞事业支援促进委员会成立
  11. Win10 默认输入变全角问题解决方法
  12. DZ先生怪谈国标之云台控制流程
  13. postgresql兼容MySQL on update current_timestamp
  14. Linux之企业实训篇——haproxy与pacemaker实现高可用负载均衡
  15. 程序逸的Java项目之旅-图书管理系统之数据库设计(1)
  16. GSoC 2022 Blender VSE: 第二、三周总结
  17. java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-
  18. WindowsXP/7/10 Python3.6.3开发环境配置图文教程
  19. 中年人学C语言Windows程序设计,30 DialogBox控件
  20. 不同的工具包对Voxel-based morphometry (VBM)计算结果的影响

热门文章

  1. 【转】如何在Qt 4程序中优化布局结构-兼回答网友提问
  2. 毕设日志——Linux软连接的建立与删除
  3. 解决sublime text3 v3.1.1,Build3176中的汉字形状扭曲问题
  4. memcached一致性哈希及php客户端实现
  5. IntelliJ IDEA配置与搭建web项目入门使用
  6. mysql慢查询分析工具和分析方法
  7. 流程多节点调用同一张业务表单的锚点问题
  8. 11.11.17 start L3
  9. vs2005配置c语言连接mysql
  10. 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL