EPOLL模型

最近在公司里面主要负责一些手机网络游戏的服务器端的编写。虽然接触时间不多,但是感触良多。特意将我此段时间的体会和大家分享。

  以前公司的服务器都是使用HTTP连接,但是这样的话,在手机目前的网络情况下不但显得速度较慢,而且不稳定。因此大家一致同意用SOCKET来进行连 接。虽然使用SOCKET之后,对于用户的费用可能会增加(由于是用了CMNET而非CMWAP),但是,秉着用户体验至上的原则,相信大家还是能够接受 的(希望那些玩家月末收到帐单不后能够保持克制...)。

  这次的服务器设计中,最重要的一个突破,是使用了EPOLL模型,虽然对之也是一知半解,但是既然在各大PC网游中已经经过了如此严酷的考验,相信他不会让我们失望,使用后的结果,确实也是表现相当不错。在这里,我还是主要大致介绍一下这个模型的结构。

名词解释:man epoll之后,得到如下结果:

NAME
       epoll - I/O event notification facility

SYNOPSIS
       #include

DESCRIPTION
       epoll is a variant of poll(2) that can be used either as Edge or Level
       Triggered interface and scales well to large numbers of  watched  fds.
       Three  system  calls  are provided to set up and control an epoll set:
       epoll_create(2), epoll_ctl(2), epoll_wait(2).

       An epoll set is connected to a file descriptor created  by  epoll_cre-
       ate(2).   Interest for certain file descriptors is then registered via
       epoll_ctl(2).  Finally, the actual wait is started by epoll_wait(2).

其实,一切的解释都是多余的,按照我目前的了解,EPOLL模型似乎只有一种格式,所以大家只要参考我下面的代码,就能够对EPOLL有所了解了,代码的解释都已经在注释中:

while (TRUE)
 {
  int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//等待EPOLL时间的发生,相当于监听,至于相关的端口,需要在初始化EPOLL的时候绑定。
  if (nfds <= 0)
   continue;
  m_bOnTimeChecking = FALSE;
  G_CurTime = time(NULL);
  for (int i=0; i<nfds; i++)
  {
   try
   {
    if (m_events[i].data.fd == m_listen_http_fd)//如果新监测到一个HTTP用户连接到绑定的HTTP端口,建立新的连接。由于我们新采用了SOCKET连接,所以基本没用。
    {
     OnAcceptHttpEpoll ();
    }
    else if (m_events[i].data.fd == m_listen_sock_fd)//如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。
    {
     OnAcceptSockEpoll ();
    }
    else if (m_events[i].events & EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入。
    {
     OnReadEpoll (i);
    }

    OnWriteEpoll (i);//查看当前的活动连接是否有需要写出的数据。
   }
   catch (int)
   {
    PRINTF ("CATCH捕获错误\n");
    continue;
   }
  }
  m_bOnTimeChecking = TRUE;
  OnTimer ();//进行一些定时的操作,主要就是删除一些短线用户等。
 }

 其实EPOLL的精华,按照我目前的理解,也就是上述的几段短短的代码,看来时代真的不同了,以前如何接受大量用户连接的问题,现在却被如此轻松的搞定,真是让人不得不感叹。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小鹏汽车面试经验分享

大家周一好&#xff0c;这篇文章转自我的朋友李纳克斯&#xff0c;在做工作的同事&#xff0c;去面试也能增长自己的技术面和技术深度。推荐给大家&#xff0c;希望对大家有所帮助。某个下午&#xff0c;小鹏汽车的HR在招聘软件上撩我&#xff0c;于是我决定去聊聊看。接触下来…

(Bezier)贝塞尔曲在路径规划的运用,机器运动控制常用

前言之前被安排了活&#xff0c;一个局部区域机器运动控制的工作&#xff0c;大致是一个机器位于一个极限区域时候&#xff0c;机器要进入一个特殊的机制&#xff0c;使得机器可以安全的走出来。其中用到了bezier曲线进行优化路径&#xff0c;今天写一下&#xff0c;正好也给大…

IT部门绩效考核:一本糊涂账?

IT部门绩效考核&#xff1a;一本糊涂账&#xff1f; 作者&#xff1a; 三人行  来源&#xff1a;赛迪网 http://www.csai.cn 2005年11月02日 AMT-企业资源管理研究中心 高级顾问 姚磊 北京新华信管理顾问有限公司 顾问 宋炜 光明乳业信息总监 赵春雨 明基逐鹿人力资源咨询…

Spark安装

1 Spark安装地址 运行环境:CentOS 6.8 Hadoop 2.7.2JDK 1.8Scala 2.11.8Spark 2.1.1 集群以3台机器模拟:hadoop202 hadoop203 hadoop204 1&#xff0e;官网地址 http://spark.apache.org/ 2&#xff0e;文档查看地址 https://spark.apache.org/docs/2.1.1/ 3&#xff0e;下载地…

mysql开启慢查询日志及查询--windows

转载地址&#xff1a;http://blog.csdn.net/ljasdf123/article/details/9713523 MySQL慢查询配置 1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? 首先我们先查看MYSQL服务器…

如何成为“10倍效率”开发者

导读&#xff1a;Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者&#xff08;10x developer&#xff09;”的概念&#xff08;伟大的开发者的效率往往比一般的开发者高很多&#xff0c;而不只是一点点&#xff09;&#xff0c;Adam Loving在读了之…

当然可以不努力

我刚开始觉得他说的不对&#xff0c;现在越看越觉得他说的有道理。我们这一代人&#xff0c;太容易被别人影响&#xff0c;小的时候&#xff0c;觉得要赶上别人家的孩子&#xff0c;所以就努力读书&#xff0c;努力干家务。长大了一些&#xff0c;要用功的工作&#xff0c;用功…

遇到问题了 .net项目发布到iis6,没有权限访问!?

系统环境&#xff1a;windows2003 sp1 iis6 .net 2 framework已经允许了asp.net 2.0的支持在vs2005中把自己的web项目发布到iis6中的虚拟目录&#xff0c; 可是无法访问呀您无权查看该网页 您可能没有权限用您提供的凭据查看此目录或网页。 如果您确信能够查看该目录或网页&am…

UNIX TCP回射服务器/客户端之使用epoll模型的服务器

程序简介&#xff1a;这是一个运用epoll系列函数进行IO复用的服务器模型。它是目前UNIX与LINUX平台上效率最高&#xff0c;最受欢迎的IO复用传输模型。 其他的不说了&#xff0c;直接粘贴代码吧&#xff01; 服务器端&#xff1a; #include "my_unp.h" int main(v…

枚举和结构

1&#xff0e; 枚举 a) 枚举类型是一种特殊的值类型&#xff0c;它用于声明一组具有相同性质的常量&#xff0c; b) 声明枚举 在C#中使用关键字enum类声明枚举&#xff0c;其形式如下。 enum 枚举名 { List1value1, List2value2, List3value3, …. …

_beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex

_beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex 天哪,好久不 写忘记了.一直记得线程的句柄只是 createthread 才需要关闭,可能是我用 AfxBeginThread 太多了. 以后直接这样好了 ::CloseHandle((HANDLE)_beginthreadex(NULL, 0,threadRun_client,(void *)tp, 0…

嵌入式界的顶流开源项目,RetroPie 是怎么设计的?

RetroPie 是啥&#xff1f;一个用于将树梅派等板子转变为游戏机的开源项目。树梅派上运行 RetroPieGithub:https://github.com/RetroPie/RetroPie-Setup第一感觉&#xff0c;基于 Shell&#xff0c;有啥牛逼的。但仔细想想&#xff0c;一个简单的项目能获得 9.4K 的 Star&#…

java线程池,信号量使用demo

直接上代码 package org.jimmy.threadtest20181121;import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;public class TestThread20181128 {public Semaphore semaphore new Semaphore(2, true)…

使用epoll+时间堆实现高性能定时器

在开发Linux网络程序时&#xff0c;通常需要维护多个定时器&#xff0c;如维护客户端心跳时间、检查多个数据包的超时重传等。如果采用Linux的SIGALARM信号实现&#xff0c;则会带来较大的系统开销&#xff0c;且不便于管理。 本文在应用层实现了一个基于时间堆的高性能定时器&…

Spring JDBC最佳实践(2)

2019独角兽企业重金招聘Python工程师标准>>> 使用DataSourceUtils进行Connection的管理 由上节代码可知&#xff0c;JdbcTemplate在获取Connection的时候&#xff0c;并不是直接调用DataSource的getConnection(),而是调用了如下的代码&#xff1a; Connection con …

我所感受到的上海

大家好&#xff0c;文章转自张老师的公众号&#xff0c;文章的我不是小编本人&#xff0c;小编现居深圳&#xff0c;刚接受了一场大雨的洗礼。前两天公众号抽奖的书籍已经发货&#xff0c;中奖的朋友们注意查收。当格蠹园里的大灰反复犹豫到底应该在哪里生产的时候&#xff0c;…

时间操作(Java版)—获取给定日期N天后的日期

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。https://blog.csdn.net/wangshuxuncom/article/details/34896777 获取给定日期N天后的日期import java.util.Calendar;public class Test {public static void main(String[] args) {System.out.println(new Te…

设计模式学习笔记五——Prototype模式

动机&#xff1a;使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。某些结构复杂对象面临着剧烈变化&#xff0c;但拥有比较稳定一致的接口&#xff0c;如何隔离出这些易变对象&#xff0c;使客户程序不随之改变&#xff1f;场景&#xff1a;Th…

2011年最佳代码

2019独角兽企业重金招聘Python工程师标准>>> 2011年最佳代码 try { if(you.bevieve(it) true || you.believe(it) false) { I.believe(it); } } catch(Exception ex) { throw new Exception("Its a miracle!"); } finally { it.justHappened(); } 转载于…

使用Epoll 在 Linux 上开发高性能应用服务器

epoll是Linux提供一种多路复用的技术&#xff0c;类似各个平台都支持的select&#xff0c;只是epoll在内核的实现做了更多地优化&#xff0c;可以支持比select更多的文件描述符&#xff0c;当然也支持 socket这种网络的文件描述符。Linux上的大并发的接入服务器&#xff0c;目前…