2009-08-30

Problem of OnReceive of CSocket

以前用过CSocket这个类,主要是考虑可以用CSocketFile进行串行化数据,比较方便。这次写的时候竟然出了几个问题:

1. 网上下载了chatter例程,用VC6.0编译后运行,没有任何问题;切换到VS2008下,编译没有问题,运行时,发现OnReceive时而触发,时而不触发。到网上查了查,同样问题的人很多,看来是个老大难了。后来加上OnReceive结束之后,调用 AsyncSelect( FD_READFD_WRITE ),解决了此问题。几乎弄了一整天,跟http://www.ecjtu.org/forum/read.php?tid-19062.html这位仁兄情况几乎相同;

2. 其实,刚开始我就发现了这个解决方案,但是我一直觉得OnReceive函数由系统框架来调用,不应该需要施加“外力”影响。国外很多人说是OnReceive函数里面调用了多次Receive引发的。如果真是这样,另外一个问题就是CArchieve的load动作跟CSocket的Receive关系是什么?

3. CArchieve的Read和Write函数可以读写缓冲区,我原来一直用“>>”和“<<"符号一个一个地写DWORD,晕,效率很低。

结论:好像用CSocketFile来发送、接受数据有点得不偿失,问题很多,实际也没有带来很多好处。不如直接用CAsyncSocket类呢。

没有评论: