linux异步通信之epoll【转】
转自:http://www.cnblogs.com/snake-hand/archive/2012/08/13/2636229.html
1、简介
epoll是linux提供的一种异步的I/O通知方式,相比较于select机制而言,select是轮询的,而epoll是触发式的,而且select的最大连接数只有1024,超过这个限制后就只能使用多进程来操作了。所以epoll的效率相对而言更高。
2、主要函数
epoll_create 创建epoll
epoll_ctl 把某个句柄添加到epoll里面
epoll_wait 等待epoll事件的产生。只要注册的句柄发生了变化即会检查到有epoll事件的产生。
3、主要流程
/* 创建EPOLL*/
iEpollFd = epoll_create(MYPING_EPOLLEVENT_MAX);
/* 设置sicket选项 */
stServaddr.ucLen = sizeof(stServaddr);
stServaddr.ucFamily = (UCHAR)AF_LIPC;
stServaddr.usPort = htons(LIPC_GLOBAL_PORT_MYPING);
stServaddr.usAddr = htons(LIPC_LIP_ADDR_ANY); /* 创建 socket */
iLipcFd = socket(PF_LIPC, SOCK_DGRAM, LIPC_PROTO_STCP);
/* bind socket */
iRet += bind(iLipcFd, (struct sockaddr *)(&stServaddr), (UINT)sizeof(LIPC_SOCK_ADDR_S));
/* listen socket */
iRet += listen(iLipcFd, SOMAXCONN); /* bind or listen error */
if(0 != iRet)
{
printf("bind or listen socket failed\r\n");
(VOID)close(iLipcFd);
return ERROR_FAILED;
} /* regist socket to epoll */
iRet = MYPING_EpollReg(EPOLLIN, iLipcFd, MYPING_LipcListenCallback);
if(0 != iRet)
{
printf("regist lipc socket to epoll failed\r\n");
(VOID)close(iLipcFd);
return ERROR_FAILED;
}
/* 等待事件的产生 */
for(;;)
{
/* this will be blocked until any registered event happend or timeout */
iNfds = epoll_wait(g_iEpollHandle, astEpEvt, MYPING_EPOLLEVENT_MAX, -1); /* 轮询产生的事件 */
for(i = 0; i < iNfds; i ++)
{
/* 获取注册的回调函数 */
pfCallback = (VOID *)(ULONG)astEpEvt[i].callback; /* 调用相关的回调函数进行处理 */
pfCallback(astEpEvt[i].events, astEpEvt[i].data.fd);
}
}
4、机制
实际上一般先在epoll上面注册一个监听的socket,当这个socket监听到有数据连接时,即创建一个新的socket来接收数据,然后把这个新的socket的句柄注册到epoll上面去,再在这个 socket的回调函数里面来做相应的处理。
linux异步通信之epoll【转】的更多相关文章
- #include <sys/epoll.h> epoll - I/O event notification facility 服务器端 epoll(7) - Linux manual page http://www.man7.org/linux/man-pages/man7/epoll.7.html
epoll使用详解(精髓) - Boblim - 博客园 https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html epoll使用详解(精髓) ...
- Linux网络服务器epoll模型的socket通讯的实现(一)
准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...
- Linux学习笔记-epoll
#include <sys/epoll.h> epoll是Linux内核的一个系统调用,一种可扩展的I/O事件通知机制,最早在Linux内核2.5.44版本引入. 它的功能是监视多文件描述 ...
- Linux编程之epoll
现在有这么一个场景:我是一个很忙的大老板,我有100个手机,手机来信息了,我的秘书就会告诉我"老板,你的手机来信息了."我很生气,我的秘书就是这样子,每次手机来信息就只告诉我来信息 ...
- linux下编程epoll实现将GPS定位信息上报到服务器
操作系统:CentOS 开发板:fl2440 开发模块:A7(GPS/GPRS),RT3070(无线网卡) ********************************************** ...
- Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)
今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...
- linux下的epoll怎样高效处理百万连接
开发高性能网络程序时.windows开发人员们言必称iocp,linux开发人员们则言必称epoll.大家都明确epoll是一种IO多路复用技术,能够很高效的处理数以百万计的socket句柄,比起曾经 ...
- 简单通讯聊天 群聊功能 Windows下的客户端 Linux下的epoll服务器
1 服务器代码 Linux eclipse C++ //======================================================================= ...
- 比较一下Linux下的Epoll模型和select模型的区别
一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Sel ...
随机推荐
- js 如何清除setinterval
var id=window.setInterval(function(){ },1000);window.clearInterval(id);
- PHP的压力测试工具ab.exe 和mpm介绍提高并发数
该工具是apache自带的,可以用它来测试网站的并发量有多大和某个页面的访问时间. 基本用法: 1. 进入CMD,转到apache的bin目录下. 2. 执行命令ab.exe -n 访问的问次数 ...
- MAC下Android的Eclipse开发环境的搭建
一.Eclipse的下载 到网站:http://www.eclipse.org/downloads/ 上,由于我们是用Java开发的所以步骤如下: 1. 找到"Eclipse IDE fo ...
- 01.Box2dWeb入门教程
1.下载box2dweb.直接在页面中引用即可. -Box2D.js是未压缩版 -Box2d.min.js是压缩版 2.编写HelloWorld代码. <!DOCTYPE HTML> &l ...
- Vue.2.0.5-插件
开发插件 插件通常会为Vue添加全局功能.插件的范围没有限制--一般有下面几种: 添加全局方法或者属性,如: vue-element 添加全局资源:指令/过滤器/过渡等,如 vue-touch 通过全 ...
- jQuery页面加载后执行的事件(3种方式)
$(function () { }); $(document).ready(function () { }); window.onload = function () { }
- iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)
在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较麻烦 ...
- AVAudioPlayer init 报错: Error Domain=NSOSStatusErrorDomain Code=1937337955
Error Domain=NSOSStatusErrorDomain Code=1937337955 原因: 音频文件的格式不规范导致 对于iOS7以上的系统(含iOS7),在确定文件格式的情况下可以 ...
- JMX超详细解读
一.JMX的定义 JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架.JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和 ...
- maven笔记-入门(helloWorld)
maven: pom.xml:文件 groupId,artifactId,Version定义了一个项目的基本坐标 groupId:定义了项目属于哪个组,往往与项目所在的组织和公司有关 artifact ...