基于UnixC的简单web服务器

news/2024/10/30 13:36:54/

t_net.h和t_net.c的代码第十三天有,这里编译时连接打包好的动态库即可  

doit.h

#ifndef DO_IT_H_
#define DO_IT_H_#include<unistd.h>#include<ctype.h>#include<t_file.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<arpa/inet.h>typedef struct request{char method[16];char path[128];char proto[16];}req_t;typedef struct response{int code;char *f_type;}res_t;void do_main(int fd);//int h_acc(int fd)#endif

doit.c

#include"doit.h"
#include<string.h>
#include<t_stdio.h>
#include<t_net.h>
char *work_dir="/home/nan/SJW/webs/hhhlaugh";
//一定要考虑字符串的结尾符号\0
static void get_request(int fd,req_t *rq){char buf[1024]; char path[128];//读取浏览器的请求头信息int r=read(fd,buf,1024);sscanf(buf,"%s %s %s\r\n",rq->method,rq->path,rq->proto);//处理/printf("%s\n",rq->method);printf("%s\n",rq->path);printf("%s\n",rq->proto);if(strcmp(rq->path,"/")==0)strcpy(rq->path,"/index.html");strcpy(path,work_dir);strcat(path,rq->path);strcpy(rq->path,path);printf("--->%s\n",rq->path);return;
}//获取文件类型  content-type
static char *get_ftype(const char *file){if(strrchr(file,'.')==NULL)return "text/html";if(strcmp(strrchr(file,'.'),".png")==0)return "image/png";if(strcmp(strrchr(file,'.'),".jpg")==0)return "image/jpg";if(strcmp(strrchr(file,'.'),".gif")==0)return "image/gif";return "text/html";
}
static void orgn_response(const char *file,res_t *rs){//获取响应码//printf("12312432->%s\n",file);rs->code=access(file,R_OK)?404:200;//获取响应文件信息  text/html  image/jpg image/pngrs->f_type=get_ftype(file);//if(rs->code==404)//printf("path--->%s\n",file);
}
//
static void res_b_200(int fd,req_t *rq,res_t *rs){char f_line[128];sprintf(f_line,"%s %d   ok\r\n",rq->proto,rs->code);char content[128];sprintf(content,"Content-Type: %s\r\n\r\n",rs->f_type);write(fd,f_line,strlen(f_line));write(fd,content,strlen(content));write(1,f_line,strlen(f_line));write(1,content,strlen(content));int s_fd=dup(1);dup2(fd,1);//将浏览器确定为标准输出if(rs->code==404){char path[128];strcpy(path,work_dir);strcat(path,"/error.html");strcpy(rq->path,path);//dup2(s_fd,1);printf("error path->%s\n",rq->path);}int a=execlp("cat","cat",rq->path,NULL);if(a==-1)perror("execlp");return;
}void do_main(int fd){req_t req;res_t res;//获取客户端的请求信息get_request(fd,&req);printf("path:%s\n",req.path);//处理客户端的请求信息,组织响应信息orgn_response(req.path,&res);printf("code:%d\ttype:%s\n",res.code,res.f_type); //响应客户端res_b_200(fd,&req,&res);//获取文件名//strchr//拼接路径//open 可读//读取文件内容//char buf[2048]={"HTTP/1.1 200 OK\r\n"};
//	strcat(buf,"");//发送/*char buf[1024];int r=read(fd,buf,1024);write(1,buf,r);*/return;
}

server.c

#include<t_stdio.h>
#include"doit.h"
#include<t_net.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<signal.h>
void handle(int n){wait(NULL);return;
}
int main(){signal(17,handle);int sfd=t_listen(AF_INET,SOCK_STREAM,3333,5);if(sfd==-1) return -1;while(1){//受理连接int cfd=h_accept(sfd);	if(cfd==-1) return -1;pid_t pid=fork();if(pid==-1) E_MSG("fork",-1);if(pid==0){close(sfd);do_main(cfd);close(cfd);exit(0);}else{close(cfd);//waitpid(-1,NULL,WNOHANG);}}return 0;
}

使用浏览器    登录127.0.0.1:3333/index.html


http://www.ppmy.cn/news/280446.html

相关文章

OpenGL之VAO,VBO和EBO

一、BO&#xff08;Buffer Object&#xff0c;缓冲对象&#xff09; 缓冲对象是OpenGL管理的一段内存&#xff0c;为了与我们CPU的内存区分开&#xff0c;一般称OpenGL管理的内存为&#xff1a;显存。 显存&#xff0c;也就是显卡里的内存。显卡访问显存比较快&#xff0c;而Bu…

详解arr.reduce()方法

reduce() 是 ECMAScript 5 &#xff08;ES5&#xff09;中新增的数组方法。 可以用于求数组中所有元素的和、求数组中所有元素的乘积、找到数组中的最大值或最小值、将二维数组转为一维数组、将数组中的元素合并成一个字符串、对数组中的对象进行分组或排序等操作。 1、语法 …

Android Studio实现五子棋小游戏

项目目录 一、项目概述二、开发环境三、详细设计1、布局设计2、验证码3、AI人机4、背景音乐 四、运行演示五、项目总结 一、项目概述 五子棋是一种两人对弈的策略型棋类游戏&#xff0c;本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI&#xff0c;实…

freeswitch透传带SDP的180

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 freeswitch对于180/183的消息处理有默认的规则&#xff0c;但是在3GPP的标准中&#xff0c;消息流程会更加复杂&#xff0c;场景更多变。 这样就需要我们根据实际环境中的场景定制消息流程。 本文只讨论带SDP的183/18…

苹果计算机怎样恢复桌面,mac桌面整理_使Mac桌面恢复整洁的四种技巧

摘要 腾兴网为您分享:使Mac桌面恢复整洁的四种技巧&#xff0c;智慧大学&#xff0c;湘税社保&#xff0c;完美志愿&#xff0c;双福汇等软件知识&#xff0c;以及ustar&#xff0c;录音机&#xff0c;东莞干部培训&#xff0c;小黑屋软件&#xff0c;洋葱数学app&#xff0c;发…

html5中怎么设置音频的位置,HTML5中音频的详细解析

摘要 腾兴网为您分享:HTML5中音频的详细解析&#xff0c;智慧医疗&#xff0c;榛果民宿&#xff0c;猿辅导&#xff0c;优酷等软件知识&#xff0c;以及虚拟视频&#xff0c;天正建筑tarch8.5&#xff0c;跟谁学登录&#xff0c;照片回收站&#xff0c;医学生简历模板&#xff…

ADAudit Plus:保护企业信息安全的强大内部审计解决方案

内部安全审计在现代企业中扮演着至关重要的角色。它是确保组织网络和系统安全的关键步骤&#xff0c;帮助企业发现和解决潜在的安全风险和漏洞。在这个信息技术高度发达的时代&#xff0c;保护企业的敏感数据和防范内部和外部威胁变得尤为重要。 内部安全审计 ADAudit Plus是一…

数据仓库基础知识

数据仓库 企业信息应用现状企业对应用集成的需求1. 什么是BI1.1 BI的定义1.2 BI要做的事情1.3 BI的智能1.4 BI应用架构1.5 BI系统架构1.6 BI应用带来的关键效益 2. 什么是数据仓库2.1 数据仓库的概念2.2 数据仓库的特性 3. 数据仓库设计中的几个重要概念3.1 ETL3.2 数据集市&am…