要求:

实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径。如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给浏览器,服务器不发送完整的HTTP协议头,CGI程序自己负责输出一部分HTTP协议头。

配置文件(config.txt):

  1. PORT=8000
  2. Directory=./peizhi

HTML文件(index_html):

  1. <form>
  2. First name:
  3. <input type="text" name="firstname"/>
  4. <br/>
  5. Last name:
  6. <input type="test" name="Lastname"/>
  7. </from>

服务器代码:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10.  
  11. #define MAXLINE 80
  12.  
  13. void deal_config(int *port_number,char *path);
  14.  
  15. int main(void)
  16. {
  17. struct sockaddr_in servaddr,cliaddr;
  18. socklen_t cliaddr_len;
  19. int listenfd,connfd;
  20. char buf[MAXLINE];
  21. char str[INET_ADDRSTRLEN];
  22. int i,n; //n descript the side number
  23. int pd_index,ret;
  24.  
  25. int td;
  26.  
  27. int port_number;
  28. char *path=NULL;
  29.  
  30. listenfd=socket(AF_INET,SOCK_STREAM,0);
  31.  
  32. int opt=1;
  33. setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  34.  
  35. bzero(&servaddr,sizeof(servaddr));
  36. servaddr.sin_family=AF_INET;
  37.  
  38. deal_config(&port_number,path);
  39. servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  40. servaddr.sin_port=htons(port_number);
  41.  
  42. bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  43.  
  44. listen(listenfd,20);
  45.  
  46. printf("Accepting connections ...\n");
  47. while(1){
  48. cliaddr_len=sizeof(cliaddr);
  49. connfd=accept(listenfd,
  50. (struct sockaddr *)&cliaddr,&cliaddr_len);
  51.  
  52. while(1){
  53. n=read(connfd,buf,MAXLINE);
  54. if(n==0){
  55. printf("the other side has been closed.\n");
  56. break;
  57. }
  58. printf("received File from %s at PORT %d\n",
  59. inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),
  60. ntohs(cliaddr.sin_port));
  61. i=0;
  62. char title[15];
  63. while(buf[i]!='\r'){
  64. title[i]=buf[i];
  65. i++;
  66. }
  67. title[i]='\0';
  68. if(0==(strcmp(title,"GET / HTTP/1.1"))){
  69. bzero(buf,MAXLINE);
  70. strcpy(buf,"HTTP/1.1 200 0K\r\n");
  71. write(connfd,buf,strlen(buf));
  72. bzero(buf,MAXLINE);
  73. strcpy(buf,"Conent_Type: peizhi/html\r\n");
  74. write(connfd,buf,strlen(buf));
  75. bzero(buf,MAXLINE);
  76. buf[0]='\r';
  77. buf[1]='\n';
  78. write(connfd,buf,2);
  79. pd_index=open("./peizhi/index.html",O_RDONLY);
  80. if(pd_index<0){
  81. perror("open file failed.\n");
  82. exit(1);
  83. }
  84. bzero(buf,MAXLINE);
  85. while((ret=read(pd_index,buf,MAXLINE))>0){
  86. write(connfd,buf,ret);
  87. printf("send index data...\n");
  88. bzero(buf,MAXLINE);
  89. }
  90. close(pd_index);
  91. }
  92. }
  93. }
  94. }
  95. void deal_config(int *port_number,char *path)
  96. {
  97. FILE *fd;
  98.  
  99. fd=fopen("./peizhi/config.txt","r");
  100. if(fd<0){
  101. perror("open config failed.\n");
  102. exit(1);
  103. }
  104. fscanf(fd,"PORT=%d\nDirectory=%s",port_number,path);
  105.  
  106. }

启动服务器,打开浏览器输入127.0.0.1:8000可得如下界面:

程序不是很完善,会慢慢改进,希望大家批评指正。

[置顶] 在Ubuntu下实现一个简单的Web服务器的更多相关文章

  1. linux系统下开启一个简单的web服务

    linux 下开启一个简单的web服务: 首先需要linux下安装nodejs 然后创建一个test.js:   vi test.js var http =require("http&quo ...

  2. 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  3. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  4. 一个简单的web服务器

    写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...

  5. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  6. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  7. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  8. 《深度解析Tomcat》 第一章 一个简单的Web服务器

    本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...

  9. 一个简单的Web服务器-支持Servlet请求

    上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...

随机推荐

  1. php验证复选框有效性的示例

    本文介绍一个简单的php通过代码验证复选框值的有效性,有需要的可以参考一下 验证复选框的php代码,如下: 复制代码代码如下: <?php   /**   * 在php中验证复选框的有效性  * ...

  2. php设计模式笔记:单例模式

    php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...

  3. ecshop改造读写分离

    前两天配置好了mysql主从方式,今天就拿ecshop练习读写分离.以下代码仅供学习参考,不成熟的地方,还需完善. config.php <?php $db_name = "ecsho ...

  4. angular.js的post数据方式

    公司的项目前端部分现在改用angular,一切从头学起,今天记录一下关于数据请求的问题,由于get的请求方式比较简单,与post也类似,所以就单独讲讲post方式. 文档上post数据的写法有好几种, ...

  5. PDF转WORD工具 Solid Converter PDF v9.1.6744

    Solid Converter PDF中文破解版(pdf转换成word转换器)是一款功能强大的PDF格式转换软件.Solid Converter PDF允许用户将PDF转换为Word(PDF to W ...

  6. 详解C/C++函数指针声明

    要理解一个C程序,仅仅理解组成该程序的符号是不够的.程序员还必须理解这些符号是如何组合成声明.表达式.语句和程序的. 我们先来看看下面的一个语句: 1 ( *( void(*)())0)(); 这是当 ...

  7. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  8. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  9. [wikioi]乌龟棋

    http://wikioi.com/problem/1068/ 多重背包.边界f[0,0,0,0]=a[1](初始时没有用任何卡片,获得棋盘第一格的分数)DP方程:f[i,j,k,l]=max(f[i ...

  10. 【Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools】

    原文:[Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools] 如何安装 darwin.iso,百度去吧. 关键是对应版本的darwin ...