#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 通讯实例
linux socket epoll 模型,linux网络编程学习实例。
socket epoll实现。替代原有的select机制,更好的提供网络传输效率。
封装了epoll功能,很简单的使用epoll,只需要指定epoll服务监听端口,就可以运行epoll服务。可以指定收到数据的回调函数,可以指定有连接的回调函数,可以指定网络关闭的回调函数。自己编写调试epoll模型可能要几天...
主要是基于TCP/IP协议的socket通信。包括服务器端和客户端两部分,其中客户端使用了select的IO多路复用技术,服务器端由于要监听多个客户端,因此使用了epoll的IO多路复用技术。整个项目目前可以实现的功能有用户的...
linux epoll服务器+windows 客户端 socket tcp通信的例子.zip
最近在开发im服务器,需要大...我 github找到了epoll版本的qt.修改了QT的socket notify内核,不需要修改原来编写的代码,直接设置QT的事件转发方式就行了。支持qt4.0和5.0 csdn博客:http://blog.csdn.net/rushroom
linux socket tcp epoll使用教程 例子 源代码
c/c++ socket epoll 运用 变成。 效率远胜于select
linux socket tcp大并发 epoll使用教程 有关epoll的一切
linux C下用epoll写的socket服务器实例,自己引用头文件,哈哈!
大并发服务器编程模型 windows iocp完成端口模型可支持1万大并发,但是linux能作到5万大并发
C++ Socket epoll
python代码,用epoll处理socket并发(csdn)————程序
linux下epoll模式的socket,可支持多用户同时向服务器发送请求。
基于linux系统利用epoll模型实现高并发网络通讯,含客户端和服务器模式。
linux C++ C mysql socket 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 :...
多路IO复用,使用C++对epoll封装,并且加入服务端socket封装,亲测可用,能够实现高并发管理,也处理了许多服务器开发过程中的细节问题,下载即可使用!