cookis 发表于 2008-07-18 10:51

回复 #40 fm971 的帖子

能否讲一下 sk_buff 在什么环境下使用, 有什么效果?

zsniper 发表于 2008-07-18 10:52

原帖由 cookis 于 2008-7-18 10:35 发表 http://bbs.chinaunix.net/images/common/back.gif
就像QQ msn 都有心跳, 让服务器知道它们还活着.. 而不是网络中断, 或主机已经断电, 或程序崩溃, 这样才好管理这些client,
而不是一直持有它们所占的资源.

我昨晚看了一下livevent 的 active timeout 机制,...


红黑树难道不能知道最小值和最大值吗??

还有我也说了,这是我的效率很低的实现方法。

我想这应该比心跳来的更灵活吧~

我现在的实现方法,就是基于libevent的超时机制,超时 后再调用自己设定的函数,发出确认数据包,没有收到时,就close();

cookis 发表于 2008-07-18 10:56

回复 #41 fm971 的帖子

如果要单线程的话. 定时器的驱动就得是epoll 或select了.
只排序就行了. 不用查找. 我们只需要得到与当前时间相差最大的定时器对象就可以了.

cookis 发表于 2008-07-18 11:00

回复 #43 zsniper 的帖子

我没有说红黑树得不到最大值和最小值. 我只是想说堆结构更适合这种只需要最大值和最小值的需求

其实仔细想想. 如果为每个连接做一个超时机制. 还不如单独做一个定时器来定时检查所有的连接是否超时.
这样唤醒epoll 或kqueue的机会要少得多. 也就是epoll 或 kqeueu的处理非socket事件的压力要少得多.

zsniper 发表于 2008-07-18 11:04

回复 #45 cookis 的帖子

我觉得自己写效率不是很高,因为技术还达不到,

所以我就建议用libevent.

还有在我的程序里面,只要接受到封包格式错误的数据包,我就认为这是非法数据包,直接close(),所以不用担心客户端不断发送恶意数据包的情况。

[ 本帖最后由 zsniper 于 2008-7-18 11:06 编辑 ]

cookis 发表于 2008-07-18 11:07

回复 #46 zsniper 的帖子

我觉得没什么神秘的..只要你用对了算法. 效率跟他一样.

我想请教一个问题. 我在libevent中没有看到互斥.那么它是怎么运转event_loop 的. 如果我有新的socket要注册进去怎么办
而且我整个服务也不可能只有一个线程啊.

zsniper 发表于 2008-07-18 11:26

回复 #47 cookis 的帖子

event_loop就是单线程的阿~

localsocket就是等待accept事件,新的socket进来后,再通过回调函数设置读写事件,加入eventbase

cookis 发表于 2008-07-18 11:33

回复 #48 zsniper 的帖子

OK

event_loop run with thread1

业务逻辑肯定运行在另外一个线程thread2. 如果thread2 想注册或先移除一个socket.
不能直接操作event_list吧.

zsniper 发表于 2008-07-18 11:41

回复 #49 cookis 的帖子

业务逻辑在上层完成,完成后让IO_MAIN_THREAD处理注册或先移除一个socket

之间用队列联系起来,

这就是所谓的HAHS模式。

cookis 发表于 2008-07-18 12:19

回复 #50 zsniper 的帖子

no..no.

我还是无法理解. 在没有互斥的情况下. 其他线程怎么通知所谓的 IO_MAIN_THREAD 注册或移除 socket
页: 1 2 3 4 [5] 6 7 8 9 10 11 12
查看完整版本: 超高性能网络编程, Asynchronous network I/O