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

 #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. Oracle备份的几种方式

    这里使用Oracle 12C来大概演示说明一下rman的基本用法,这里不会深入讨论,因为本人也只是刚刚才接触,只是结合了网上的一些文章以及自己的实践来总结并拿出来大家学习,谢谢 目录 一.关于备份与恢 ...

  2. sourceinsight4 用设置

    通用设置Options - File Type Options: 显示行号:勾选Show line mumbers选中自动高亮:勾选Hightlight references to selected ...

  3. Genome Aggregation Database (gnomAD) 简介 | 参考人群等位基因频率数据库

    Genome Aggregation Database (gnomAD) 这是一个关于什么的数据库?broad institute开发的,整合了目前几乎所有的公共的WES和WGS测序数据,并对数据做了 ...

  4. 商城怎么使用ajax?

    1.前端: Ajax.call('order.php?act=export', params, function (data) { document.getElementById("expo ...

  5. yii2 下的redis常用命令集合

    <?php \Yii::$app->redis->set('user','aaa'); \Yii::$app->redis->set('user2','bbb'); \Y ...

  6. Java基础 import 要在所有的class前面

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  7. [转]WebMercator与经纬度互转

    //经纬度转Web墨卡托 Vector3 lonLat2WebMercator(Vector3 lonLat) { Vector3 mercator; ; + lonLat.y)*)) / (); y ...

  8. 网站无法连接上,但能上QQ的解决办法

    一句话:修改DNS的IP地址 参考win10修改IP地址:https://jingyan.baidu.com/article/19192ad8eef0c9e53e570717.html 在网络上搜索合 ...

  9. zookeeper使用过程的错误

    一.zookeeper启动成功,dubbo服务也注册成功,但是服务消费者调用失败 报错如下: [myid:] - INFO [SyncThread:0:ZooKeeperServer@645] - E ...

  10. JSOUP 爬虫

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.mavne 依赖: <!--html 解析 : jsoup HTML parser library @ ...