回复 #40 fm971 的帖子
能否讲一下 sk_buff 在什么环境下使用, 有什么效果? 原帖由 cookis 于 2008-7-18 10:35 发表 http://bbs.chinaunix.net/images/common/back.gif就像QQ msn 都有心跳, 让服务器知道它们还活着.. 而不是网络中断, 或主机已经断电, 或程序崩溃, 这样才好管理这些client,
而不是一直持有它们所占的资源.
我昨晚看了一下livevent 的 active timeout 机制,...
红黑树难道不能知道最小值和最大值吗??
还有我也说了,这是我的效率很低的实现方法。
我想这应该比心跳来的更灵活吧~
我现在的实现方法,就是基于libevent的超时机制,超时 后再调用自己设定的函数,发出确认数据包,没有收到时,就close();
回复 #41 fm971 的帖子
如果要单线程的话. 定时器的驱动就得是epoll 或select了.只排序就行了. 不用查找. 我们只需要得到与当前时间相差最大的定时器对象就可以了.
回复 #43 zsniper 的帖子
我没有说红黑树得不到最大值和最小值. 我只是想说堆结构更适合这种只需要最大值和最小值的需求其实仔细想想. 如果为每个连接做一个超时机制. 还不如单独做一个定时器来定时检查所有的连接是否超时.
这样唤醒epoll 或kqueue的机会要少得多. 也就是epoll 或 kqeueu的处理非socket事件的压力要少得多.
回复 #45 cookis 的帖子
我觉得自己写效率不是很高,因为技术还达不到,所以我就建议用libevent.
还有在我的程序里面,只要接受到封包格式错误的数据包,我就认为这是非法数据包,直接close(),所以不用担心客户端不断发送恶意数据包的情况。
[ 本帖最后由 zsniper 于 2008-7-18 11:06 编辑 ]
回复 #46 zsniper 的帖子
我觉得没什么神秘的..只要你用对了算法. 效率跟他一样.我想请教一个问题. 我在libevent中没有看到互斥.那么它是怎么运转event_loop 的. 如果我有新的socket要注册进去怎么办
而且我整个服务也不可能只有一个线程啊.
回复 #47 cookis 的帖子
event_loop就是单线程的阿~localsocket就是等待accept事件,新的socket进来后,再通过回调函数设置读写事件,加入eventbase
回复 #48 zsniper 的帖子
OKevent_loop run with thread1
业务逻辑肯定运行在另外一个线程thread2. 如果thread2 想注册或先移除一个socket.
不能直接操作event_list吧.
回复 #49 cookis 的帖子
业务逻辑在上层完成,完成后让IO_MAIN_THREAD处理注册或先移除一个socket之间用队列联系起来,
这就是所谓的HAHS模式。
回复 #50 zsniper 的帖子
no..no.我还是无法理解. 在没有互斥的情况下. 其他线程怎么通知所谓的 IO_MAIN_THREAD 注册或移除 socket