说明:暂时只是实现了静态网页的响应

 #include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h> #define PORT 8000
char* msg_err="HTTP/1.1 404 NO FOUND\r\nContent-Type:text/html\r\n\r\n";
char* msg_text="HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n";
char* msg_jpg="HTTP/1.1 200 OK\r\nContent-Type:image/jpg\r\n\r\n";
char* msg_png="HTTP/1.1 200 OK\r\nContent-Type:image/png\r\n\r\n";
char* work_dir="/home/soft01/Hector/Unixc/webProject/hah/www";
char* work_dir_err="/home/soft01/Hector/Unixc/webProject/hah/err_404.html"; //定义http协议 结构体
typedef struct http{
char method[];
char filename[];
char protol[];
}utr_t; //自定义信号处理函数
//回收子进程
void sig_do(){
wait(NULL);
return;
} //响应
void write_client(char* str,int fd,char* msg){
char status[];
int fd_open=open(str,O_RDONLY);
if(fd_open==-){
perror("open");
int fd_open=open(work_dir_err,O_RDONLY);
int nlen=read(fd_open,status,);
write(fd,msg_err,strlen(msg_err));
write(fd,status,nlen);
return;
}
int nlen=read(fd_open,status,);
write(fd,msg,strlen(msg));
write(fd,status,nlen);
return;
} //判断图片文本
void judge_text_or_png(char* str,int fd){
char* msg="<html>\n<body>\n<h1>404\n</body>\n</html>\n";
if(str==NULL){return;}
char* tmp=NULL;
if((tmp=strstr(str,".jpg"))!=NULL){
write_client(str,fd,msg_jpg);
}
else if((tmp=strstr(str,".png"))!=NULL){
write_client(str,fd,msg_png);
}
else if((tmp=strstr(str,".html"))!=NULL){//文本
write_client(str,fd,msg_text);
}
else{
write(fd,msg_err,strlen(msg_err));
write(fd,msg,strlen(msg));
}
return;
} //子进程响应客户端
void request_do(int fd){
utr_t http;
char path[];
char buf[];
int len=read(fd,buf,);
sscanf(buf,"%s %s %s\r\n",http.method,http.filename,http.protol);
if(strcmp(http.filename,"/")==){
strcpy(http.filename,"/index.html");
} strcpy(path,work_dir);
strcat(path,http.filename);
strcpy(http.filename,path);
printf("method:%s filename:%s protol:%s\n", http.method,http.filename,http.protol); //判断图片文本
judge_text_or_png(http.filename,fd); return;
} int main(){
struct sockaddr_in serv;
struct sockaddr_in clie;
socklen_t clie_len;
signal(SIGCHLD,sig_do);
//创建socket通讯端口
int sfd=socket(AF_INET,SOCK_STREAM,);
if(sfd==-){
perror("socket");
return -;
} //初始化服务器serv
serv.sin_family=AF_INET;
serv.sin_port=htons(PORT);
serv.sin_addr.s_addr=htonl(INADDR_ANY);
//将sfd绑定到服务器
int b=bind(sfd,(struct sockaddr*)&serv,sizeof(serv));
if(b==-){
perror("bind");
return -;
}
listen(sfd,);
while(){
clie_len=sizeof(clie);
//建立和客户端的连接
int cfd=accept(sfd,(struct sockaddr*)&clie,&clie_len);
if(cfd==-){
perror("accept");
return -;
}
pid_t pid=fork();
if(pid==-){
perror("pid");
return -;
}
if(pid==){//子进程
close(sfd);
//响应客户端请求
request_do(cfd);
close(cfd);
exit();
}
else{//父进程
close(cfd);
} }
return ;
}

Linux下实现web服务器的更多相关文章

  1. Linux下查看Web服务器当前的并发连接数和TCP连接状态

    对于web服务器(Nginx.Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态. $ netstat -n | ...

  2. Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...

  3. Linux下嵌入式Web服务器BOA和CGI编程开发

    **目录**一.环境搭建二.相关配置(部分)三.调试运行四.测试源码参考五.常见错误六.扩展(CCGI,SQLite) # 一.环境搭建操作系统:Ubuntu12.04 LTSboa下载地址(但是我找 ...

  4. Linux系统下LNMP一键搭建Linux、PHP、MySQL环境(适合新手搭建linux下的web生成环境)

    一. 首先要解释一下,什么是LNMP,LNMP起源于LAMP,LAMP是Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的缩写,这里将Web服务端的Apache替换 ...

  5. 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  6. Linux下安装Tomcat服务器和部署Web应用

    一.上传Tomcat服务器

  7. 转】Linux下安装Tomcat服务器和部署Web应用

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4097608.html 感谢! 一.上传Tomcat服务器

  8. Linux 下安装 Tomcat 服务器和部署 Web 应用

    一.上传Tomcat服务器 二.安装Tomcat服务器 2.1.解压tomcat服务器压缩包 2.2.配置环境变量 tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK用到的那些环境变量 ...

  9. 转 Linux下安装Tomcat服务器和部署Web应用

    转载声明: http://www.cnblogs.com/xdp-gacl/p/4097608.html 一.上传Tomcat服务器

随机推荐

  1. Ubuntu安装邮件服务器

    Ubuntu搭建邮件服务器 此文我们使用Postfix来搭建邮箱服务器,Postifx是一个SMTP服务器.SMTP服务器也被称为MTA(message transfer agent) 一.安装pos ...

  2. 深度学习面试题03:改进版梯度下降法Adagrad、RMSprop、Momentum、Adam

    目录 Adagrad法 RMSprop法 Momentum法 Adam法 参考资料 发展历史 标准梯度下降法的缺陷 如果学习率选的不恰当会出现以上情况 因此有一些自动调学习率的方法.一般来说,随着迭代 ...

  3. 范仁义html+css课程---2、html常用标签

    范仁义html+css课程---2.html常用标签 一.总结 一句话总结: html常用的标签有 标题标签.div.span.p.hr.br标签 等 1.html中的标题标签有哪些? <h1& ...

  4. 【转】Root检测与反检测

    0x00背景需要在手机上构建一个环境对root过的设备进行伪装,让设备里面的应用将该设备当成未root的设备.10x01 Root检测手段1.检查已安装的APK包:SuperSU应用程序或者一键roo ...

  5. 数据缺失值的处理 | R包 - mice

    有些情况下缺失值会零星的分布在数据当中,这时去掉所有包含缺失值的样本就不行了,直接用0去填补缺失值也不行. 所以此时就应该用拟合的方法来填补缺失值. library(mice) init = mice ...

  6. Unix下可用的五种 I/O 模型

    介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户 ...

  7. wrod: 突然无法输入汉字

    “文件”-“选项”-“高级”-“去掉 输入法控制处于活动状态复选框”.

  8. Android访问WCF服务

    原文链接:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html 本章目的: 用Wcf建立可以上Android可以访问的数据服务, 数据 ...

  9. flutter 数据存储 SP和sqlite

    添加插件: shared_preferences: ^0.4.2 path_provider: ^1.2.0 sqflite: ^0.12.0 import 'dart:async'; import ...

  10. 008-SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required

    一.Spring Boot发布war包流程: 1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都 ...