Linux下实现web服务器
说明:暂时只是实现了静态网页的响应
#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服务器的更多相关文章
- Linux下查看Web服务器当前的并发连接数和TCP连接状态
对于web服务器(Nginx.Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态. $ netstat -n | ...
- Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...
- Linux下嵌入式Web服务器BOA和CGI编程开发
**目录**一.环境搭建二.相关配置(部分)三.调试运行四.测试源码参考五.常见错误六.扩展(CCGI,SQLite) # 一.环境搭建操作系统:Ubuntu12.04 LTSboa下载地址(但是我找 ...
- Linux系统下LNMP一键搭建Linux、PHP、MySQL环境(适合新手搭建linux下的web生成环境)
一. 首先要解释一下,什么是LNMP,LNMP起源于LAMP,LAMP是Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的缩写,这里将Web服务端的Apache替换 ...
- 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Linux下安装Tomcat服务器和部署Web应用
一.上传Tomcat服务器
- 转】Linux下安装Tomcat服务器和部署Web应用
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4097608.html 感谢! 一.上传Tomcat服务器
- Linux 下安装 Tomcat 服务器和部署 Web 应用
一.上传Tomcat服务器 二.安装Tomcat服务器 2.1.解压tomcat服务器压缩包 2.2.配置环境变量 tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK用到的那些环境变量 ...
- 转 Linux下安装Tomcat服务器和部署Web应用
转载声明: http://www.cnblogs.com/xdp-gacl/p/4097608.html 一.上传Tomcat服务器
随机推荐
- 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 20165326
网络欺诈防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...
- Python-matplotlib画图(莫烦笔记)
https://www.zhihu.com/collection/260736383 https://blog.csdn.net/gaotihong/article/details/80983937 ...
- useContext 让父子组件传值更简单(五)
有了useState和useEffect已经可以实现大部分的业务逻辑了,但是React Hooks中还是有很多好用的Hooks函数的,比如useContext和useReducer. 在用类声明组件时 ...
- Hibernate Persistence Contexts
Hibernate ORM 5.2.18.Final User Guidehttps://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/ ...
- Kotlin从零到精通Android开发
作者 博客地址 https://blog.csdn.net/aqi00 最新源代码 https://github.com/aqi00/kotlin 资源下载和内容勘误 https://blog.cs ...
- Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)
转自https://www.cnblogs.com/lwh-note/p/9639835.html 两种情况(场景) 情况一 代码还只在本地,未push到运程仓库,想把代码还原到上一次com ...
- 如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘
如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘 摘自:http://blog.sina.com.cn/s/blog_7525b71f0101d0u8.html ...
- 【缺少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
- idea使用快捷键ALT+/的时候,本来想在new后面创建对象,结果又出来一个new
我们知道eclipse的自动提示补齐new 后面的对象的快捷键是ALT+/,当我使用idea的时候,把idea的快捷键换成了eclipse的风格. 然而当我按下ALT+/的时候,就给我自动输入了一个n ...
- 小程序 支持html富文本吗
详见: https://www.jianshu.com/p/9b9b97b17393