疑问,epoll服务器如何发送广播包?
时间:2010-07-09
来源:互联网
如果server要对所以链接的client依次发送广播包如何搞定?
无奈之下我使用了一个笨办法,我自己创建了一个链表,每个节点存放一个client链接fd,如果server要向所有client发送广播数据,就循环读取链表节点依次发送。
请问各位大牛,有啥好方法能从server的epoll fd中获取所有client链接fd吗?
好像不光epoll网络模型,select的情况也类似。
作者: mgqw 发布时间: 2010-07-09
作者: hellioncu 发布时间: 2010-07-09

作者: mgqw 发布时间: 2010-07-09
是有点土。。用数组就行了。。
作者: peidright 发布时间: 2010-07-09
+1 我也用数组。不过还有一个空闲块栈,这样分配新连接只需要弹出数组的空闲下标就能马上能用了,不用顺序查空闲块。总之能不用链表坚决不用。
作者: 没本 发布时间: 2010-07-09
作者: rain_fish 发布时间: 2010-07-09
看来我还是土冒了一回

作者: mgqw 发布时间: 2010-07-09
能详细说一下方法不?
作者: mgqw 发布时间: 2010-07-09
回复 mgqw
就是一个数组A和一个栈S,深度都是N。A存用来存fd及连接相关的其他数据。S存没有用到的A的下标。最初栈S是满的,栈S顶上的元素就是A[0]的下标0,S底部是A[N-1]的下标N-1。
一个连接进来后,从栈S弹一个下标0出来给fd用,fd直接写入A[0]而无需链表或线性表查找。又一个连接进来的话,从栈S再弹一个下标1出来给新的fd用,新的fd直接写入A[1]。依次类推。
一个连接断开释放的话,假设该链接对应的下标n,则清空A[n],将下标n压入栈S。
如果栈S为空,说明数组A满了,无法给新连接再分配数组项,处理错误。
如果栈S为满,说明服务器连接数为0。
由于我知道总连接数(N - 栈S当前元素个数),因此即使要广播给所有连接,也不用遍历整个数组A,只要循环计数处理到有效连接数==总连接数时就可以退出循环。
作者: 没本 发布时间: 2010-07-09
为什么不用STL?难道写C很过瘾???
作者: shang2010 发布时间: 2010-07-09

没看出这里用stl的理由。。
作者: peidright 发布时间: 2010-07-10
>> 由于我知道总连接数(N - 栈S当前元素个数),因此即使要广播给所有连接,也不用遍历整个数组A,
>> 只要循环计数处理到有效连接数==总连接数时就可以退出循环。
还是要遍历A对吧, 只是不一定要全部遍历?
作者: xinglp 发布时间: 2010-07-10
收到/发送数据包时不用遍历,直接访问。定时器处理心跳包超时或者楼主要求的向所有连接广播时才需要遍历。
作者: 没本 发布时间: 2010-07-10
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28