当前位置: 首页 > news >正文

17zwd一起做网站株洲站企业门户网站什么意思

17zwd一起做网站株洲站,企业门户网站什么意思,网站做扫一扫,网站建设销售技巧话术1.引言 Web服务器是一个基于Linux的简单的服务器程序#xff0c;其主要功能是接收HTTP请求并发送HTTP响应#xff0c;从而使客户端能够访问网站上的内容。本项目旨在使用C语言#xff0c;基于epoll模型实现一个简单的Web服务器。选择epoll模型是为了高效地处理大量并发连接…1.引言 Web服务器是一个基于Linux的简单的服务器程序其主要功能是接收HTTP请求并发送HTTP响应从而使客户端能够访问网站上的内容。本项目旨在使用C语言基于epoll模型实现一个简单的Web服务器。选择epoll模型是为了高效地处理大量并发连接。 2.项目概览 这个项目的目标是实现一个简单的Web服务器可以处理基本的HTTP请求并发送相应的HTTP响应。项目结构包括服务器初始化、Epoll模型的使用、事件处理循环、HTTP请求处理、文件发送、错误处理等关键模块。技术和工具方面使用了C语言、epoll模型以及socket编程。 根据这个服务器可以实现下面的功能打开Linux环境下的文件。 在浏览器上面的搜索栏输入http://192.168.44.3:9999/hanzi.c 192.168.44.3是Linux环境的本机IP地址9999是端口号hanzi.c是打开的文件名 3.Epoll模型 1. 基本概念和优势 Epoll简介EpollEvent Poll是Linux内核为处理大量文件描述符而设计的一种高效的I/O事件通知机制。它允许程序监视多个文件描述符上的事件状态而无需轮询这些文件描述符。 优势 高效的事件通知机制Epoll使用基于事件的机制只有当事件发生时才会通知应用程序避免了轮询的开销。支持大量并发连接 适用于处理大量并发连接的场景能够有效管理数以千计的文件描述符。适用于非阻塞I/O 与非阻塞模型结合使用使得应用程序能够同时处理多个连接而不被阻塞。 2. 创建Epoll树和添加文件描述符 // 创建epoll树 int epfd epoll_create(1024); if (epfd 0) {perror(epoll_create error);close(lfd);return -1; }// 将监听文件描述符lfd添加到epoll树上 struct epoll_event ev; ev.data.fd lfd; ev.events EPOLLIN; epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, ev);epoll_create 创建一个epoll实例返回一个用于标识该实例的文件描述符。epoll_ctl 控制epoll实例的行为可以用于注册、修改或删除文件描述符。 3. Epoll事件处理循环 int nready; struct epoll_event events[1024]; while (1) {// 等待事件发生nready epoll_wait(epfd, events, 1024, -1);if (nready 0) {if (errno EINTR) {continue;}break;}for (int i 0; i nready; i) {int sockfd events[i].data.fd;// 处理监听文件描述符lfd上的事件if (sockfd lfd) {// 接受新的客户端连接int cfd Accept(lfd, NULL, NULL);// 设置cfd为非阻塞int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);// 将新的cfd添加到epoll树上ev.data.fd cfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, ev);} else {// 处理客户端数据http_request(sockfd);}} }epoll_wait 等待事件发生返回就绪事件的数量。events数组 存储发生事件的文件描述符和事件类型。EPOLLIN 表示文件描述符上有可读数据。Accept函数 用于接受新的客户端连接。fcntl函数 用于设置文件描述符的属性将其设置为非阻塞。 通过这样的Epoll模型服务器能够高效地处理并发连接只在有事件发生时才进行相应的处理避免了不必要的轮询。 4. 事件处理循环 1. 服务器主循环 服务器的主循环是一个持续运行的事件处理循环通过调用等待事件的发生。一旦有事件发生主循环将负责处理这些事件。epoll_wait epoll_wait 等待事件发生返回就绪事件的数量。events数组 存储发生事件的文件描述符和事件类型。EPOLLIN 表示文件描述符上有可读数据。Accept函数 用于接受新的客户端连接。fcntl函数 用于设置文件描述符的属性将其设置为非阻塞。 2. 处理连接请求和客户端数据 在主循环中通过判断就绪事件的文件描述符可以区分是监听文件描述符lfd上的连接请求还是客户端文件描述符上的数据到达事件。 // 处理监听文件描述符lfd上的事件 if (sockfd lfd) {// 接受新的客户端连接int cfd Accept(lfd, NULL, NULL);// 设置cfd为非阻塞int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);// 将新的cfd添加到epoll树上ev.data.fd cfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, ev); } else {// 处理客户端数据http_request(sockfd); }如果是监听文件描述符lfd上的事件表示有新的客户端连接请求通过函数接受连接并将新的客户端文件描述符设置为非阻塞然后将其添加到epoll树上监听其读事件。Accept 如果是客户端文件描述符上的事件表示有数据到达调用函数处理客户端的HTTP请求。http_request 通过这样的事件处理循环服务器能够实时响应连接请求### 事件处理循环. 5.HTTP请求处理 1. 解析HTTP请求行 在处理客户端数据时首先需要解析HTTP请求行提取请求类型、文件名和协议版本。这是通过读取客户端发送的数据并解析其中的信息来实现的。 此代码从客户端文件描述符sockfd中读取HTTP请求行数据然后使用函数解析出请求类型GET、POST等、文件名和协议版本。这样服务器就能了解客户端请求的基本信息。sscanf 2. 区分请求类型处理GET请求 在得到请求类型后服务器通常需要根据不同的请求类型采取不同的处理方式。以下是处理GET请求的简化示例 //判断文件是否存在struct stat st;if(stat(pFile, st)0){printf(file not exist\n);//发送头部信息send_header(cfd, 404, NOT FOUND, get_mime_type(.html), 0);//发送文件内容send_file(cfd, error.html); }else //若文件存在{//判断文件类型//普通文件if(S_ISREG(st.st_mode)){printf(file exist\n);//发送头部信息send_header(cfd, 200, OK, get_mime_type(pFile), st.st_size);//发送文件内容send_file(cfd, pFile);}//目录文件else if(S_ISDIR(st.st_mode)){}} 在这个例子中如果是GET请求服务器首先检查请求的文件是否存在。如果文件存在就发送HTTP响应头然后发送文件内容;如果文件不存在就发送404错误页面。对于其他类型的请求非GET请求服务器返回501 Not Implemented的错误响应。 6.完整代码和项目包 webserver.c //web服务端程序--使用epoll模型 #include unistd.h #include sys/epoll.h #include fcntl.h #include sys/stat.h #include string.h #include signal.h #include dirent.h#include pub.h #include wrap.hint http_request(int cfd);int main() {//改变当前进程的工作目录char path[255] {0};sprintf(path, %s/%s, getenv(HOME), webpath);chdir(path);//创建socket--设置端口复用---bindint lfd tcp4bind(9999, NULL);//设置监听Listen(lfd, 128);//创建epoll树int epfd epoll_create(1024);if(epfd0){perror(epoll_create error);close(lfd);return -1;}//将监听文件描述符lfd上树struct epoll_event ev;ev.data.fd lfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, ev);int i;int cfd;int nready;int sockfd;struct epoll_event events[1024];while(1){//等待事件发生nready epoll_wait(epfd, events, 1024, -1);if(nready0){if(errnoEINTR){continue;}break;}for(i0; inready; i){sockfd events[i].data.fd;//有客户端连接请求if(sockfdlfd){//接受新的客户端连接cfd Accept(lfd, NULL, NULL);//设置cfd为非阻塞int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);//将新的cfd上树ev.data.fd cfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, ev);}else{//有客户端数据发来http_request(cfd);} } } }int send_header(int cfd, char *code, char *msg, char *fileType, int len) {char buf[1024] {0};sprintf(buf, HTTP/1.1 %s %s\r\n, code, msg);sprintf(bufstrlen(buf), Content-Type:%s\r\n, fileType);if(len0){sprintf(bufstrlen(buf), Content-Length:%d\r\n, len);}strcat(buf, \r\n);Write(cfd, buf, strlen(buf));return 0; }int send_file(int cfd, char *fileName) {//打开文件int fd open(fileName, O_RDONLY);if(fd0){perror(open error);return -1;}//循环读文件, 然后发送int n;char buf[1024];while(1){memset(buf, 0x00, sizeof(buf));n read(fd, buf, sizeof(buf));if(n0){break;}else{Write(cfd, buf, n);}} }int http_request(int cfd) {int n;char buf[1024];//读取请求行数据, 分析出要请求的资源文件名memset(buf, 0x00, sizeof(buf));Readline(cfd, buf, sizeof(buf));printf(buf[%s]\n, buf);//GET /hanzi.c HTTP/1.1char reqType[16] {0};char fileName[255] {0};char protocal[16] {0};sscanf(buf, %[^ ] %[^ ] %[^ \r\n], reqType, fileName, protocal);printf([%s]\n, reqType);printf([%s]\n, fileName);printf([%s]\n, protocal);char *pFile fileName1;printf([%s]\n, pFile);//循环读取完剩余的数据while((nReadline(cfd, buf, sizeof(buf)))0);//判断文件是否存在struct stat st;if(stat(pFile, st)0){printf(file not exist\n);//发送头部信息send_header(cfd, 404, NOT FOUND, get_mime_type(.html), 0);//发送文件内容send_file(cfd, error.html); }else //若文件存在{//判断文件类型//普通文件if(S_ISREG(st.st_mode)){printf(file exist\n);//发送头部信息send_header(cfd, 200, OK, get_mime_type(pFile), st.st_size);//发送文件内容send_file(cfd, pFile);}//目录文件else if(S_ISDIR(st.st_mode)){}} } 本文用到了俩个库pub.h 和wrap.h 这俩个头文件 本文在提供了完整的代码包https://download.csdn.net/download/qq_64691289/88547649
http://www.yutouwan.com/news/91366/

相关文章:

  • 商城网站前台模板网上购物系统软件开发
  • 岳阳网站建设公司怎么查网站备案信息
  • 网站建设电网站建设用阿里云的虚拟主机
  • 昆明微网站制作新手学纪事本html代码做网站
  • 炫酷的移动端网站东莞公司网站怎么做
  • 网站维护的基本内容包括哪些广东网站建设排名
  • 厦门网站建设设计网站备案幕布
  • 金泉网站建设开发哪些网站可以医生做兼职
  • 公司网站的留言板怎么做网站开发编码选择一般是
  • 做网站店铺装修的软件如何建设一个博客网站
  • 网站开发找公司好还是个人阳谷聊城做网站
  • 可以建网站的公司cms影视建站系统
  • 免费的奖励网站有哪些铜山徐州网站开发
  • 便利的微网站建设vi视觉识别系统设计
  • 如何用一个域名做多个网站wordpress整合问答系统
  • 网站建设工作标准南京网站设计哪家公司好
  • 设计网站页面要多少钱网站为什么被百度k了
  • 表格做的网站影响收录天津哪家做企业网站
  • 做流程图用什么网站最近几年做电影网站怎么样
  • 云南专业做网站多少钱做网站的时候字体应该多大
  • 静态网站添加到织梦项目计划书的六大要素
  • 网站建设公司 优势代做网站推广的公司
  • 阿里巴巴网站建设教程视频长春网站推广优化
  • 东莞服饰网站建设哪家好上海网站优化推广
  • 网站首页被k 不恢复建设银行网站怎么查工资明细
  • 做网站最下面写什么做网站感觉挣不到钱啊
  • 深圳房产网站建设国外手机网站模板
  • dede网站首页加悬浮广告路桥区商用营销型网站建设
  • 一般网站建设好多久被收录vi设计模板源文件
  • 天津网站设计怎样自学开网店