epoll例子
发布日期:2021-10-10 05:31:21
浏览次数:39
分类:技术文章
本文共 3184 字,大约阅读时间需要 10 分钟。
#include#include #include #include #include #include #include #include /* socket类定义需要*/ #include /* epoll头文件 */ #include /* nonblocking需要 */ #include /* 设置最大的连接数需要setrlimit */ #define MAXEPOLL 10000 /* 对于服务器来说,这个值可以很大的! */ #define MAXLINE 1024 #define PORT 6000 #define MAXBACK 1000 //!> 设置非阻塞 //!> int setnonblocking( int fd ) { if( fcntl( fd, F_SETFL, fcntl( fd, F_GETFD, 0 )|O_NONBLOCK ) == -1 ) { printf("Set blocking error : %d\n", errno); return -1; } return 0; } int main( int argc, char ** argv ) { int listen_fd; int conn_fd; int epoll_fd; int nread; int cur_fds; //!> 当前已经存在的数量 int wait_fds; //!> epoll_wait 的返回值 int i; struct sockaddr_in servaddr; struct sockaddr_in cliaddr; struct epoll_event ev; struct epoll_event evs[MAXEPOLL]; struct rlimit rlt; //!> 设置连接数所需 char buf[MAXLINE]; socklen_t len = sizeof( struct sockaddr_in ); //!> 设置每个进程允许打开的最大文件数 //!> 每个主机是不一样的哦,一般服务器应该很大吧! //!> rlt.rlim_max = rlt.rlim_cur = MAXEPOLL; if( setrlimit( RLIMIT_NOFILE, &rlt ) == -1 ) { printf("Setrlimit Error : %d\n", errno); exit( EXIT_FAILURE ); } //!> server 套接口 //!> bzero( &servaddr, sizeof( servaddr ) ); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); servaddr.sin_port = htons( PORT ); //!> 建立套接字 if( ( listen_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) { printf("Socket Error...\n" , errno ); exit( EXIT_FAILURE ); } //!> 设置非阻塞模式 //!> if( setnonblocking( listen_fd ) == -1 ) { printf("Setnonblocking Error : %d\n", errno); exit( EXIT_FAILURE ); } //!> 绑定 //!> if( bind( listen_fd, ( struct sockaddr *)&servaddr, sizeof( struct sockaddr ) ) == -1 ) { printf("Bind Error : %d\n", errno); exit( EXIT_FAILURE ); } //!> 监听 //!> if( listen( listen_fd, MAXBACK ) == -1 ) { printf("Listen Error : %d\n", errno); exit( EXIT_FAILURE ); } //!> 创建epoll //!> epoll_fd = epoll_create( MAXEPOLL ); //!> create ev.events = EPOLLIN | EPOLLET; //!> accept Read! ev.data.fd = listen_fd; //!> 将listen_fd 加入 if( epoll_ctl( epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev ) < 0 ) { printf("Epoll Error : %d\n", errno); exit( EXIT_FAILURE ); } cur_fds = 1; while( 1 ) { if( ( wait_fds = epoll_wait( epoll_fd, evs, cur_fds, -1 ) ) == -1 ) { printf( "Epoll Wait Error : %d\n", errno ); exit( EXIT_FAILURE ); } for( i = 0; i < wait_fds; i++ ) { if( evs[i].data.fd == listen_fd && cur_fds < MAXEPOLL ) //!> if是监听端口有事 { if( ( conn_fd = accept( listen_fd, (struct sockaddr *)&cliaddr, &len ) ) == -1 ) { printf("Accept Error : %d\n", errno); exit( EXIT_FAILURE ); } printf( "Server get from client !\n"/*, inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port */); ev.events = EPOLLIN | EPOLLET; //!> accept Read! ev.data.fd = conn_fd; //!> 将conn_fd 加入 if( epoll_ctl( epoll_fd, EPOLL_CTL_ADD, conn_fd, &ev ) < 0 ) { printf("Epoll Error : %d\n", errno); exit( EXIT_FAILURE ); } ++cur_fds; continue; } //!> 下面处理数据 //!> nread = read( evs[i].data.fd, buf, sizeof( buf ) ); if( nread <= 0 ) //!> 结束后者出错 { close( evs[i].data.fd ); epoll_ctl( epoll_fd, EPOLL_CTL_DEL, evs[i].data.fd, &ev ); //!> 删除计入的fd --cur_fds; //!> 减少一个呗! continue; } write( evs[i].data.fd, buf, nread ); //!> 回写 } } close( listen_fd ); return 0; }
转载地址:https://blog.csdn.net/qq_22054285/article/details/86692867 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月29日 01时02分19秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于「木兰」编译器,加十行代码实现 ∈ (属于集合)语法
2021-06-29
创建安卓键盘演示——“好不”
2021-06-29
木兰编程语言入门教程之三——函数和类型
2021-06-29
基于「木兰」逆向工程用 pyinstaller 生成可执行文件
2021-06-29
从微盟事件看商业数据公开化的必然趋势
2021-06-29
为新语言编写Visual Studio Code语法高亮插件
2021-06-29
手机编程环境初尝试-用AIDE开发Android应用
2021-06-29
Java关键字的汉化用词探讨
2021-06-29
程序员面试时用中文命名写白板代码的好处
2021-06-29
1992年日本对母语编程的可读性比较实验
2021-06-29
[转] 用python编写控制网络设备的自动化脚本3:启动
2021-06-29
扩展Python控制台实现中文反馈信息
2021-06-29
扩展Python控制台实现中文反馈信息之二-正则替换
2021-06-29
在PyPI测试平台发布Python包
2021-06-29
中文代码示例之Electron桌面应用开发初体验
2021-06-29
中文代码示例之NW.js桌面应用开发初体验
2021-06-29
为《 两周自制脚本语言 》添加中文测试代码
2021-06-29
将《 两周自制脚本语言 》测试中使用的接口中文化
2021-06-29
5分钟入门LingaScript-尝鲜中文版TypeScript
2021-06-29