epoll在socket通信中的应用
当服务器需要服务多个客户时,需要使用并发通信,实现并发通信有以下几种方法:
1、在服务器中fork子进程来为每个客户服务 具体可参考http://www.cnblogs.com/ggjucheng/archive/2012/01/17/2324584.html
2、epoll
step1: int epfd = epoll_create(intsize); //通知内核需要监听size个fd
step2: int epoll_ctl(int epfd, int op, int fd, struct epoll_event*event); //注册事件,一般为server fd,即listener
step3: int epoll_wait(int epfd, struct epoll_event * events, intmaxevents, int timeout); //等待事件触发,等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sockct fd和事件类型放入到events数组中。注:发生的条件为events[n].data.fd == listener,即如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
step4:将这个客户端的event通过epoll_ctl加入到epoll的监听队列里面
step5:events[n].data.fd != listener时,意味着不是主socket的事件,是一个用户socket的事件,可以用来处理这个用户socket的事情
以下内容摘自知乎:
服务器后端框架其中大致差不多,可从以下几个部分去综合考虑设计:
一、套接字IO模型(Linux)
1 应用场景:a.登陆低并发,大量长连接,少量活动连接,TCP;b.业务未知,对事件的响应时间未知。
2 进(线)程模型设计:1.a中的场景是最适合使用epollIO复用模型,这种情况下,epoll的效率比其他IO复用模型(select,poll)要高效。如果业务简单(不耗时,不阻塞):单进程+eppll足以应付,在epoll的主循环中依次处理事件即可。业务比较耗时:单进程多线程+epoll或多进程+epoll,主进(线)程负责监听和分发事件,工作进程(线程)处理事件。
epoll在socket通信中的应用的更多相关文章
- Socket通信中AF_INET 和 AF_UNIX域的区别
转载:http://blog.csdn.net/sandware/article/details/40923491 1. AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程. ...
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...
- socket通信中select函数的使用和解释
select函数的作用: select()在SOCKET编程中还是比较重要的,可是对于初学SOCKET的人来说都不太爱用select()写程序,他们只是习惯写诸如 conncet().accept() ...
- [转]SOCKET通信中TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...
- Socket通信中的 BeginReceive与EndReceive
BeginReceive 与endReceive 必须成对出现,如果BeginReceive没有及时调用endReceive,可能会出现数据被从buffer中读取二次,如果在下面这行代码下面加入别的代 ...
- IO创建Socket通信中慎用BufferReader中的readLine()
在编写Socket的Demo的时候,在Server中使用BufferReader获取从客服端发送过来的内容 package cn.lonecloud.socket; import cn.loneclo ...
- .net平台下C#socket通信(中)
上篇.net平台下C#socket通信(上)介绍了socket通信的基本原理及最基本的通信方式.本文在此基础上就socket通信时经常遇到的问题做一个简单总结,都是项目中的一些小问题,拿来此处便于下次 ...
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Python简易聊天工具-基于异步Socket通信
继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...
随机推荐
- worker_pool的例子
鉴于poolboy的坑,pooler不支持r18,又有在知乎上看到大神推荐worker_pool这个进程池框架(工作者进程在创建时崩溃,worker_pool不受影响),所以研究了下,贴个小例子 my ...
- HDU 3480 division
题目大意:一个有n个数的集合,现在要求将他分成m+1个子集,对子集i设si表示该集合中最大数与最小数的差的平方.求所有si的和的最小值.n<=10000,m<=5000. 分析:最优解的m ...
- CSS常用样式整理
元素边框显示圆角:-moz-border-radius适用于火狐浏览器,-webkit-border-radius适用于Safari和Chrome两种浏览器. 浏览器渐变背景颜色: FILTER: p ...
- purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0
purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0 你在iOS6下使用3G网络时可能会遇到这条log,不用紧张,这只是苹果的工 ...
- ADO.NET基础(增删改查)
ADO.NET是一种数据访问技术,就是将C#和MSSQL连接起来的一个纽带.可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用. ADO.NET是所有 ...
- shell中实现自动登录(bash环境脚本中)
自己的脚本: #!/bin/bash expect -c " set timeout 3600; spawn su -; expect *assword:*; ...
- C++模板元编程 - 2 模仿haskell的列表以及相关操作
这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D> ...
- android:gravity 和 android:layout_Gravity属性
LinearLayout有两个非常相似的属性: android:gravity 与android:layout_gravity. 他们的区别在于: android:gravity 属性是对该view中 ...
- ucos-内存管理:
注意:一个内存分区至少含有2个内存块(块的大小至少能满足一个指针大小) 1先定义一个内存块结构指针OS_MEM *buffMEM,在定义一个而为指针A[m][n] 2创建内存分区:buffMEM=OS ...
- ConcurrentHashMap使用要点
ConcurrentHashMap的简要总结: 1.public V get(Object key)不涉及到锁,也就是说获得对象时没有使用锁: 2.put.remove方法要使用锁,但并不一定有锁争用 ...