linux c++ epoll的简单实现
来源:互联网 发布:mmd成人动作数据 编辑:程序博客网 时间:2024/06/10 15:02
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/select.h> #include <sys/time.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/epoll.h> #include <errno.h> #define OPEN_MAX 100000int main(){ struct epoll_event event; struct epoll_event *wait_event; int sockfd=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in server_addr; server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port=htons(8001); bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); listen(sockfd,100); int sockNumber[OPEN_MAX]={0}; sockNumber[0]=sockfd; int crRet=epoll_create(10); if(-1==crRet) { perror("创建文件描述符失败"); return 0; } event.data.fd=sockfd; event.events=EPOLLIN; int clRet=epoll_ctl(crRet,EPOLL_CTL_ADD,sockfd,&event); if(-1==clRet) { perror("注册监听事件类型失败"); } int max1=0; char buf[1024]={0}; while(1) { wait_event=new epoll_event[max1+1]; clRet=epoll_wait(crRet,wait_event,max1+1,-1); for(int i=0;i<clRet;i++) { if((sockfd==wait_event[i].data.fd)&&(EPOLLIN==wait_event[i].events&EPOLLIN)) { struct sockaddr_in cli_addr; socklen_t length = sizeof(cli_addr); sockNumber[max1+1]=accept(sockfd,(struct sockaddr*)&cli_addr,&length); if(sockNumber[max1+1]>0) { event.data.fd = sockNumber[max1+1]; event.events = EPOLLIN; int ret1 = epoll_ctl(crRet, EPOLL_CTL_ADD, sockNumber[max1+1], &event); max1++; if(-1==ret1) { perror("新连接的客户端注册失败"); } printf("客户端%d上线\n",max1); } } else if(wait_event[i].data.fd>3&&( EPOLLIN == wait_event[i].events & (EPOLLIN|EPOLLERR))) { memset(buf,0,sizeof(buf)); int len=recv(wait_event[i].data.fd,buf,sizeof(buf),0); if(len<=0) { for(int j=1;j<=max1;j++) { if(wait_event[i].data.fd==sockNumber[j]) { clRet=epoll_ctl(crRet,EPOLL_CTL_DEL,wait_event[i].data.fd,wait_event+i); printf("客户端%d下线\n",max1); sockNumber[j] =sockNumber[max1] ; close(sockNumber[max1]); sockNumber[max1] =-1; max1--; usleep(50000); } } } else { printf("%s\n",buf); } } } delete[] wait_event; } return 0;}
0 0
- linux下Epoll实现简单的C/S通信
- linux下Epoll实现简单的C/S通信
- linux下Epoll实现简单的C/S通信
- linux下Epoll实现简单的C/S通信
- linux下Epoll实现简单的C/S通信
- linux下Epoll实现简单的C/S通信(转载)
- linux下Epoll实现简单的C/S通信
- Linux下epoll实现简单的C/S通信
- linux c++ epoll的简单实现
- C语言以epoll方式实现的简单socket实例
- 多路转接-EPOLL 及简单的EPOLL服务器实现
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- 关于epoll服务器反馈的简单实现
- Linux Epoll简单封装
- linux epoll 简单例子
- Linux epoll简单脉络
- Linux下利用线程池模型+epoll实现简单的HTTP服务器
- Linux中epoll()函数的底层实现
- Maven中Pom文件打包配置build
- Java基础复习---面向对象程序设计
- 130. Surrounded Regions 将包围的符号变换 BFS & DFS & UNION find
- Median of Two Sorted Arrays
- 51单片机串口通信(字符串接收和发送)
- linux c++ epoll的简单实现
- JavaScript常用的事件及简单应用
- Leetcode 112 Path Sum
- (新人)公司考核对web项目的一些要求 下次我要注意
- 将网页内容写入本地
- Centos7安装Golang1.6,并配置vim环境
- 在android中编译连接 .c 的可执行文件
- Quartz 线程处理
- Android 通用Adapter封装