#include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <netinet/in.h> #include <string.h> #include <sys/epoll.h> #define EPOLLSIZE 100 #define MAXEVENTS 100 #define LINESIZE 1024 int main() { int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd == -1) { perror("socket error"); exit(errno); } int yes = 1; if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("setsockopt error"); exit(errno); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(55555); if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind error"); exit(errno); } if (listen(listen_fd, 10) == -1) { perror("listen error"); exit(errno); } int epollfd = epoll_create(EPOLLSIZE); if (epollfd == -1) { perror("epoll_create error"); exit(errno); } struct epoll_event event; event.data.fd = listen_fd; event.events = EPOLLIN | EPOLLET; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_fd, &event) == -1) { perror("epoll_ctrl error"); exit(errno); } struct epoll_event* events = calloc(MAXEVENTS, sizeof(struct epoll_event)); while (1) { int nfds = epoll_wait(epollfd, events, MAXEVENTS, -1); if (nfds == -1) { perror("epoll_wait error"); exit(errno); } int n = 0; for (n=0; n<nfds; n++) { if(events[n].data.fd == listen_fd) { struct sockaddr_in client_addr; int addr_len = sizeof(client_addr); int client_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &addr_len); if (client_fd == -1) { perror("accept error"); continue; } printf("accept client %d\n", client_fd); event.data.fd = client_fd; event.events = EPOLLIN | EPOLLET; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, client_fd, &event) == -1) { perror("client epoll_ctl error"); continue; } } else { char rb[LINESIZE] = {0}; int len = recv(events[n].data.fd, rb, LINESIZE, 0); if (len == -1) { perror("recv error"); continue; } printf("recv from client[%d] len[%d]:%s\n", events[n].data.fd, len, rb); } } } return 0; }
相关推荐
基于socket epoll的高并发下多线程日志收集程序,可达到10000并发量而不丢失数据
socket epoll 通讯实例
socket epoll实现。替代原有的select机制,更好的提供网络传输效率。
当有新的连接请求到达时,`epoll_wait()`会返回该监听Socket的描述符,我们可以通过`accept()`接受连接并创建新的Socket,然后也将这个新的Socket加入Epoll。对于已连接的Socket,我们同样可以监控其读写事件,以便...
封装了epoll功能,很简单的使用epoll,只需要指定epoll服务监听端口,就可以运行epoll服务。可以指定收到数据的回调函数,可以指定有连接的回调函数,可以指定网络关闭的回调函数。自己编写调试epoll模型可能要几天...
主要是基于TCP/IP协议的socket通信。包括服务器端和客户端两部分,其中客户端使用了select的IO多路复用技术,服务器端由于要监听多个客户端,因此使用了epoll的IO多路复用技术。整个项目目前可以实现的功能有用户的...
- 当使用epoll时,将socket添加到epoll实例中,设置为监听读事件,然后进入`epoll_wait()`的循环,当有新的连接请求时,调用`accept()`接受连接,再将新连接的socket加入epoll实例。 5. **Windows客户端编程** - ...
linux socket tcp epoll使用教程 例子 源代码
"epoll_高并发socket通讯_"主题深入探讨了如何利用epoll机制来处理高并发的网络通信,包括服务器端和客户端的实现。 epoll是Linux内核提供的I/O多路复用技术,它通过事件驱动的方式优化了对大量文件描述符(如...
linux socket tcp大并发 epoll使用教程 有关epoll的一切
linux C下用epoll写的socket服务器实例,自己引用头文件,哈哈!
在Linux操作系统中,`epoll`是一个用于处理大量并发I/O事件的高效机制,尤其适用于网络编程中的套接字(socket)操作。`epoll`是`poll`和`select`模型的升级版,旨在解决高并发场景下的性能瓶颈问题。在本资料包中,...
在Python编程中,处理并发的网络连接通常会涉及到I/O多路复用技术,这里主要讲解的是使用`select.epoll()`来实现socket并发处理的方法。`epoll`是Linux内核提供的一种高效I/O事件通知机制,适用于大量并发连接的情况...
大并发服务器编程模型 windows iocp完成端口模型可支持1万大并发,但是linux能作到5万大并发
本项目"epoll_socket.zip"聚焦于C++在Linux环境下对epoll接口的封装,以及服务端socket的处理,提供了亲测可用的代码实现,帮助开发者更高效地管理并发连接。 首先,我们来理解一下多路I/O复用。在传统的网络编程中...
本篇文章将深入探讨如何在Linux环境下使用`epoll`与`socket`实现UDP通信。 首先,我们需要了解UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它的主要特点是速度快、开销小,但不保证数据的...
`epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)` 将socket的文件描述符注册到epoll,同时设置了监听的事件类型:`EPOLLIN`表示可读事件,`EPOLLET`则将epoll设置为边缘触发模式,即只通知一次事件发生...
能在linux(epoll)运行基于C# .net standard2.0 写的socket框架,可使用dotnet core程序集 安装NuGet: https://www.nuget.org/packages/socket.core/ Package Manager: Install-Package socket.core .Net CLI :...
linux服务器大并发编程之epoll使用手册-epoll可实现5万socket tcp同时在线.zip
最近在开发im服务器,需要大...我 github找到了epoll版本的qt.修改了QT的socket notify内核,不需要修改原来编写的代码,直接设置QT的事件转发方式就行了。支持qt4.0和5.0 csdn博客:http://blog.csdn.net/rushroom