+ -
当前位置:首页 → 问答吧 → 疑问,epoll服务器如何发送广播包?

疑问,epoll服务器如何发送广播包?

时间:2010-07-09

来源:互联网

在epoll网络模型中,server accept一个新的client链接,就把这个新链接的socket fd注册到epoll fd中了,而且我查了n多资料也貌似没有查到从epoll fd中获取所有client链接fd的办法。
    如果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

回复 mgqw


    是有点土。。用数组就行了。。

作者: peidright   发布时间: 2010-07-09

回复 peidright


    +1 我也用数组。不过还有一个空闲块栈,这样分配新连接只需要弹出数组的空闲下标就能马上能用了,不用顺序查空闲块。总之能不用链表坚决不用。

作者: 没本   发布时间: 2010-07-09

这个应该自己维护吧。。。

作者: rain_fish   发布时间: 2010-07-09

回复 peidright


    看来我还是土冒了一回

作者: mgqw   发布时间: 2010-07-09

回复 没本


    能详细说一下方法不?

作者: mgqw   发布时间: 2010-07-09

本帖最后由 没本 于 2010-07-09 23:53 编辑

回复 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

本帖最后由 shang2010 于 2010-07-09 23:56 编辑

为什么不用STL?难道写C很过瘾???

作者: shang2010   发布时间: 2010-07-09

回复 shang2010

几行程序也用stl? 难道stl很过瘾?

没看出这里用stl的理由。。

作者: peidright   发布时间: 2010-07-10

回复 没本


>> 由于我知道总连接数(N - 栈S当前元素个数),因此即使要广播给所有连接,也不用遍历整个数组A,
>> 只要循环计数处理到有效连接数==总连接数时就可以退出循环。


还是要遍历A对吧, 只是不一定要全部遍历?

作者: xinglp   发布时间: 2010-07-10

回复 xinglp


    收到/发送数据包时不用遍历,直接访问。定时器处理心跳包超时或者楼主要求的向所有连接广播时才需要遍历。

作者: 没本   发布时间: 2010-07-10