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

 #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. 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 20165326

    网络欺诈防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...

  2. Python-matplotlib画图(莫烦笔记)

    https://www.zhihu.com/collection/260736383 https://blog.csdn.net/gaotihong/article/details/80983937 ...

  3. useContext 让父子组件传值更简单(五)

    有了useState和useEffect已经可以实现大部分的业务逻辑了,但是React Hooks中还是有很多好用的Hooks函数的,比如useContext和useReducer. 在用类声明组件时 ...

  4. Hibernate Persistence Contexts

    Hibernate ORM 5.2.18.Final User Guidehttps://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/ ...

  5. Kotlin从零到精通Android开发

    作者 博客地址 https://blog.csdn.net/aqi00 最新源代码 https://github.com/aqi00/kotlin 资源下载和内容勘误  https://blog.cs ...

  6. Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)

    转自https://www.cnblogs.com/lwh-note/p/9639835.html 两种情况(场景) 情况一      代码还只在本地,未push到运程仓库,想把代码还原到上一次com ...

  7. 如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘

    如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘  摘自:http://blog.sina.com.cn/s/blog_7525b71f0101d0u8.html ...

  8. 【缺少kubernetes权限】 namespaces "xxx" is forbidden: User "xxx" cannot xxx resource "xxx" in API group "xxx" in the namespace "xxx"

    需要添加权限,添加权限方式: https://github.com/argoproj/argo/issues/1068

  9. idea使用快捷键ALT+/的时候,本来想在new后面创建对象,结果又出来一个new

    我们知道eclipse的自动提示补齐new 后面的对象的快捷键是ALT+/,当我使用idea的时候,把idea的快捷键换成了eclipse的风格. 然而当我按下ALT+/的时候,就给我自动输入了一个n ...

  10. 小程序 支持html富文本吗

    详见: https://www.jianshu.com/p/9b9b97b17393