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

 #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. 20190710用控制台启动一个wcf服务

    快速阅读 如何用控制台启动一个wcf服务,已经wcf的配置和在类库中如何实现 . wcf类库 用vs新建一个类库,引用system.ServiceModel 定义接口实现服务契约和操作契约 [Serv ...

  2. 开源JS图片裁剪插件

    开源JS图片裁剪插件 一.总结 一句话总结: 要用点赞最高的插件,这样适用性最好,效果最好,出问题的概率也最低,这里电脑端和手机端都可以用的建议用 cropper.js 二.5款好用的开源JS图片裁剪 ...

  3. linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息

    zhuazai:https://blog.csdn.net/sty945/article/details/79830915 前言 ls命令 ls -a ls -l ll du命令 du -s du - ...

  4. js的prototype理解

    转载:https://www.cnblogs.com/douyage/p/8630529.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实 ...

  5. Qt 中的对象模型(Object Model)

    原标题:Qt 中的对象模型(Object Model)90不太后,余生皆折腾 本节内容主要讲了 Qt 对象模型比标准 C++ 对象模型多了什么内容,并介绍了组成 Qt 对象模型基础的相关的类.最后说明 ...

  6. 004 API约定

    在具体的学习前,我还是决定学一下,REST风格中在ES中的约定. 1.多重索引 先准备数据: 如果不小心,json里的值写错了,修改过来,重新执行即可. PUT index1/_doc/1 { &qu ...

  7. sublime 删除重复行

    sublime 删除重复行 - 国内版 Binghttps://cn.bing.com/search?q=sublime+%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E8 ...

  8. linux部署php网页

    liunx环境下运行php和传统的Java web程序不一样.我直接放在tomcat下竟然不行. 安装了php的一些环境,还是访问不了,原因是不支持https访问.没办法,还是得用tomcat,同时我 ...

  9. Laya发布微信小游戏项目

    版本2.1.1.1 创建项目时,勾选微信/百度小游戏bin目录快速调试 发布项目时,选择发布平台为微信小游戏 用微信开发者工具打开release/wxgame,这就是微信小游戏项目了,很方便

  10. CNN中计算量FLOPs的计算

    1.FLOPs的概念:全称是floating point operations per second,意指每秒浮点运算次数,即用来衡量硬件的计算性能:在CNN中用来指浮点运算次数: 2.计算过程: 如 ...