| Thinkry's profileThinkry's BlogPhotosBlogLists | Help |
Thinkry's Blog山川在眼 经纬归心 9/27/2006 统一完成端口Iocp和Epoll在《完成端口Iocp与Epoll的区别》中说了两者的重要区别是Iocp是动作完成后的通知,Epoll是告知动作可以做,类似select。
ENP中如何支持Linux和Windows,统一Iocp和Epoll呢?ENP开始编写的是Epoll部分,增加Iocp部分时发现继续采用Epoll的逻辑设计是行不通的。后来灵光突现,既然Iocp不能采用Epoll的逻辑设计,那么采用Iocp的逻辑设计,Epoll向Iocp靠拢,这样就很好的统一了Iocp和Epoll。
9/10/2006 完成端口Iocp与Epoll的区别Windows下高并发的高性能服务器一般会采用完成端口IOCP技术,Linux下则会采用Epoll。 最近写enp时发现Iocp和Epoll的一个根本区别是Epoll是返回多个socket中有事件发生的socket,类似select,不过性能更高;Iocp则是在动作完成后返回通知(完成端口中的“完成”就是这个意思)。 两者都能够把socket和一个4字节Key字段绑定在一起,Epoll中是epollevent的data字段,Iocp是Key字段。他们都能在捕获到事件时返回给应用层。看到许多实例是把socket值当作Key字段,估计是实例的缘故,实际产品中,会是一个能找到socket对应session的字段,例如session的下标或session的地址,enp中session是预分配的,key字段就是session的下标。 在Iocp中,连接被客户端关闭、recv完成、send完成、连接完成、accept完成、连接被服务器关闭、超时都会在Get函数中捕获到事件。如何区分具体是哪个事件,是通过返回的Overlapped和Bytes字段配合判断的。在enp中,没有为每个session都分配Overlapped结构,而是所有session共用几个Overlapped。 9/4/2006 服务器编程中的日志今天leader提了一份服务器编程的规范,其中一个是日志问题。一般的,日志级别分为Fatal、Error、Warning、Info、Debug和Trace,输出哪些级别的日志要能动态配置,但Fatal、Error和Info是必须要输出的,而且Debug/Trace日志要能反映程序运行的情况,为在线调试提供足够的信息,这就要求编码时就要考虑可能出错调试的情况:编码时多写点,出bug时就少些烦劳,别“日志用时方恨少”,呵呵。
有个值得考虑的情况是,在运行时如果打开Debug/Trace级别,可能会导致日志急剧增加,影响系统运行倒不是太严重,但是日志过多也会影响调试,一种方法是按制定协议或用户进行Trace,这是一个比较好的方案,就是在配置中制定Trace某个用户或消息的所有Debug/Trace,而不是所有的,这样即能输出详细信息,又不会产生太多的日志。 7/23/2006 电度插座——带电度表的电源插座前天查电费单,发现是上个月的3倍,估计是这段时间空调用多了的原因。但又不知道空调到底有多耗电,于是想到如果能在插座上增加电度表的功能,那么用电就能有数了。
今天上网搜了下,发现广州市麦科尔电力科技有限公司已经有这种产品了(http://www.mandc.com.cn/socket.htm),并且申请了专利。不过它不直接销售,而是通过代理商分销。市面上ms也没看到有卖。找机会问问看看深圳有没有代理商,希望不要太贵。
顺便查了电度表的原理。电子电度表主要是通过专用芯片来实现电度功能,其中比较知名的是microchip公司的MCP3905/6,他们网站上还有篇文章《采用MCP3905/6 进行符合IEC 标准的有功电能表设计》,呵呵,厉害。
ps:还发现了家电论坛(http://www.jd-bbs.com),其中有介绍空调安装注意事项,狂汗。。。 7/18/2006 现代人如何减压——《心灵太极:现代工作革命》强烈推荐《心灵太极:现代工作革命》柯云路著
网络编程基础之一:整编和解编好多讲网络编程的书都没有谈到整编和解编,但他确实是网络编程的基础之一。
1.什么是整编和解编?
假定有个结构TDemo需要从发送给其他结点,把TDemo从内存结构转换为Buffer的过程成为整编,反过来就是解编。
2.为什么需要整编和解编?
1)节省网络资源:如果直接memcpy,或者send(socket, &TDemo, sizeof(TDemo), 0),就可能会浪费带宽。例如TDemo中定义了char [10][1024]的字符串数组,但实际用到很少,那么白白发送了10K的数据。整编可以先把字符串的长度写进Buffer,再写入字符串,节省了大量带宽。
2)结构复杂的数据必须要整编解编:例如TDemo中如果定义了个CString的成员,那么必须得手动整编解编。
3)屏蔽不同硬件和编译器之间的差异:网络是个异构环境,网络中的节点使用的硬件、操作系统、编译器复杂多种。编译器存在数据对齐的情况,各个操作系统的字节次序也不尽相同。如果直接memcpy,就可能会出现数据错乱。必须用htons/ntohs, htonl/ntohl进行转换。
3.其他
ACE提供整编和解编的类(ACE_InputCDR/ACE_OutputCDR),手动为每个消息协议编写整编/解编的代码也不麻烦。还有人写了辅助工具,用xml定义消息的结构,然后自动生成类、整编、解编的代码。
4.参考
《C++网络编程卷1——运用ACE和模式消除复杂性》4.3节
告别bokee,移师msn spaces在bokee上的blog奇慢无比,忍无可忍,只好改用msn spaces了。想把bokee上唯一的一篇日志转过来,结果打开网页花了几分钟。。。
昨晚和jessee聊了半晚,他做的手机3D游戏很酷,希望能3G时代有好的发展。我们还一同去pizicheng的blog上去灌了一把,呵呵~~。
|
|
|||||
|
|