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

深圳有实力的网站建设服务商wordpress 上传大小

深圳有实力的网站建设服务商,wordpress 上传大小,各大企业网站文案,设计网络网站有哪些功能epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能:**客…

epoll实现IO多路转接服务器

可通过以下视频学习

06-opell函数实现的多路IO转接_哔哩哔哩_bilibili

通过响应式–多路IO转接实现

文章目录

  • epoll实现IO多路转接服务器
    • 1.思路&功能
      • 核心思路
    • 2.代码实现
      • multi_epoll_sever.c
      • 运行图

1.思路&功能

**功能:**客户端输入小写字符串,服务器转成大写返回给客户端

思路:

核心思路

  1. socket()、bind()、listen()
  2. epoll_create创建红黑树,它的返回值就是树的根节点
  3. epoll_ctl将listenfd添加到树上
  4. 循环epoll_wait进行监听,它的返回值是满足监听的总个数,所以以它的返回值为遍历上限去判断事件
  5. 如果它返回的数组中data.fd等于lfd,那么就accept去连接客户端 并将新的cfd加入树中
  6. 如果不是lfd,就说明有读事件发生,就去判断读到的返回值,<0是出错 ==0是客户端关闭(这两个都要去将该cfd从树中移除 并close),>0就处理数据然后写回

2.代码实现

multi_epoll_sever.c

#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/epoll.h>
#include <fcntl.h>#define OPEN_MAX 5000
#define SERVE_PORT 9527int main()
{// 所需要的变量int lfd, cfd, efd, ret, wait_ret, i, sockfd, len;char buf[1024];// 地址结构体struct sockaddr_in serve_addr, client_addr;socklen_t client_addr_len;serve_addr.sin_family = AF_INET;                // IPV4serve_addr.sin_port = htons(SERVE_PORT);        // 绑定端口serve_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定ip(ANY系统自动分配)// 创建socketlfd = socket(AF_INET, SOCK_STREAM, 0);if (lfd < 0){perror("socket error");exit(1);}// bind绑定bind(lfd, (struct sockaddr *)&serve_addr, sizeof(serve_addr));// 设置上限listen(lfd, 128);// 创建红黑树efd = epoll_create(1); // efd就是树的根节点// 将lfd挂在树上// epoll结构体                       ep是epoll_wait所需的数组(存放满足事件的fd)struct epoll_event tep, ep[128]; //  tep是epoll_ctl的参数(传监听的事件)tep.events = EPOLLIN;tep.data.fd = lfd;ret = epoll_ctl(efd, EPOLL_CTL_ADD, lfd, &tep);if (ret < 0){perror("epoll_ctl error");exit(1);}// 循环去epoll_wait进行监听while (1){wait_ret = epoll_wait(efd, ep, 128, -1); // wait_ret就是实际满足事件的总个数// 以wait_ret为上限去遍历事件for (i = 0; i < wait_ret; i++)	{// sockfd用于接收满足事件的fdsockfd = ep[i].data.fd;// 如果等于lfd,那就说明有客户端要来连接,就去acceptif (sockfd == lfd)	{client_addr_len = sizeof(client_addr);cfd = accept(lfd, (struct sockaddr *)&client_addr, &client_addr_len);// 将cfd设置为非阻塞int flag = fcntl(cfd, F_GETFL);flag |= O_NONBLOCK;fcntl(cfd, F_SETFL, flag);// 把新的cfd加入树中tep.events = EPOLLIN | EPOLLET;tep.data.fd = cfd;ret = epoll_ctl(efd, EPOLL_CTL_ADD, cfd, &tep);if (ret < 0){perror("epoll_ctl cfd error");exit(1);}}// 如果不是lfd,那就说明有读事件发生(读数据)else{len = read(sockfd, buf, sizeof(buf));if (len == 0) // 说明对方关闭连接(从树上摘下 & close){epoll_ctl(efd, EPOLL_CTL_DEL, sockfd, NULL);close(sockfd);}else if (len == -1){perror("read error");exit(1);}else // 读写数据{for (i = 0; i < len; i++)buf[i] = toupper(buf[i]);write(sockfd, buf, len);write(STDIN_FILENO, buf, len);}}}}return 0;
}
gcc multi_epoll_sever.c -o multi_epoll_sever
//也可以使用和其他多路IO一样的封装的warp.h warp.c的版本
//就不贴warp.c和warp.c了,大家有需要可以去select和poll的博客中查看
#include"warp.h"
#define SERV_PORT 9527
#define OPEN_MAX 20
int main(int argc,char * argv[])
{int i,listenfd,connfd,efd,res,nready,sockfd;int n,num=0;char buf[4096],str[INET_ADDRSTRLEN];socklen_t clien;listenfd=Socket(AF_INET,SOCK_STREAM,0);	int opt=1;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));struct sockaddr_in servaddr,cliaddr;struct epoll_event tep,ep[OPEN_MAX];servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERV_PORT);servaddr.sin_addr.s_addr=htonl(INADDR_ANY);Bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));Listen(listenfd,128);efd=epoll_create(OPEN_MAX);if(efd==-1)perr_exit("epoll_create error");tep.events=EPOLLIN;tep.data.fd=listenfd;res=epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep);if(res==-1)perr_exit("epoll_ctl error");for(;;){nready=epoll_wait(efd,ep,OPEN_MAX,-1);if(nready==-1)perr_exit("epoll_wait error");for(i=0;i<nready;i++){if(!ep[i].events&EPOLLIN)continue;if(ep[i].data.fd==listenfd){clien=sizeof(cliaddr);connfd=Accept(listenfd,(struct sockaddr *)&cliaddr,&clien);printf("received from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port));printf("cfd %d---client %d\n",connfd,++num);tep.events=EPOLLIN;tep.data.fd=connfd;res=epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep);if(res==-1)perr_exit("epoll_ctl error");}else{sockfd=ep[i].data.fd;n=Read(sockfd,buf,4096);if(n==0){res=epoll_ctl(efd,EPOLL_CTL_DEL,sockfd,NULL);if(res==-1)perr_exit("epoll_ctl error");Close(sockfd);printf("client[%d] closed connection\n",sockfd);}else if(n<0){perror("read n<0 error:");res=epoll_ctl(efd,EPOLL_CTL_DEL,sockfd,NULL);Close(sockfd);}else{for(i=0;i<n;i++)buf[i]=toupper(buf[i]);Write(STDOUT_FILENO,buf,n);Write(sockfd,buf,n);}}}}Close(listenfd);Close(efd);return 0;
}

运行图

两个客户端访问服务器端

image-20241213104728787

http://www.yayakq.cn/news/137704/

相关文章:

  • 关于拳馆网站建设计划书宁夏 网站制作
  • 蓝色 宽屏 网站 模板下载个人网站备案名字大全
  • 专业网站建设公司兴田德润简介现在用什么做网站
  • 济宁网站建设topasp.net+制作网站开发
  • 广告做图网站太原网页制作招聘网
  • 房产证查询系统官方网站绍兴做网站比较专业的公司
  • 找一个网站做优化分析用c 做网站和数据库方法
  • 专门做兼职的网站网站做推广有用吗
  • 广东建设厅网站查询聚通装潢口碑好不好
  • 威龙电子商务做的网站如何查询营业执照注册信息
  • 阳江房产网站企业网站建设安阳
  • 网站售后电商网站基本功能
  • 商城开发网站建设开发lnmp wordpress 登陆
  • 做关于什么内容的网站学校官网查询入口
  • 视频素材库网站下载2020互联网公司排名
  • 增加网站收录上海网站建设公司排行
  • 常熟做网站推广的vs2012建设网站
  • 云南网站开发公司介绍加强普法网站和普法网络集群建设
  • 惠州网站建设找惠州邦搜索引擎排名原理
  • 哪个网站可以找做软件兼职的中国招标信息公开网
  • 泰安网站建设流程宿迁市建设局网站维修基金
  • 电子商务网站设计实践报告做网站和app怎么跑业务
  • 做网站具体流程关闭wordpress注册邮件
  • ps里新建网站尺寸怎么做企业网站设计建设
  • 潍坊住房和城乡建设厅网站电话移动 开发 网站建设
  • 东莞公司企业设计网站建设wordpress 表单数据
  • 网站上传源码后怎么弄河南省二级建造师报名入口官网
  • wordpress pc站m站西安php网站建设
  • 竞价网站做推广方案网站怎么优化呢
  • html5响应式网站psd系统优化的方法知识点