[转贴]再来发点牢骚

感觉博主应该是个很牛的人:http://dryfish118.spaces.live.com/

     《Windows网络编程技术》应该是中文市面上最权威的Windows网络编程方面的书籍了。我想大多数研究Windows平台网络的人,都应该看过这本书。从内容来看,虽然比较落后,应该是2000年左右的书,但这些年网络编程的技术并没有太多更新。要说变,反而是基于这些基础协议之上的东西越来越日新月异了——HTML5、Javascript等等等等。反正对于常年搞C++的人来说,这些东西都太“潮”。说远了,还是说说这本书。书应该是老外写的,符合老外著书一向的大、全、细原则。然后这本这是有很多的硬伤,最严重的一点,就是翻译水平太次了,甚至觉得是个技术门外汉干得活,很多专业名词与国内已经约定俗成的计算机用语不合。再就是太过于大全细了,以致重点不突出,许多地方笔墨太少。比如我看了快一个星期的第8章,总共才35页。要讲清楚那么多问题,真有点捉襟见肘,我基本上都是参考完代码后再调试实验很长时间才搞清楚流程。就是这样到现在为止最后一部分“完成端口”还是没搞明白。并且最关键的是,每种方式的优劣势并没有分析清楚,何时用哪种,哪种效率最高,应该如何使用,都没有说明。
    差点成了书评,继续发点牢骚话,说说书中的明显问题:
    “完成例成”的说明是有问题的。书上说,当调用WSAWaitMultiObjects或者SleepEx等待后,判断返回值是否是WSA_IO_COMPLETION。其实这是错误的,因为根本就不存在WSA_IO_COMPLETION的定义。奇怪的是我在MSDN中查找WSAWaitMultiObjects的说明,也发现了WSA_IO_COMPLETION。难道是早期的Windows就有这个定义?幸好在WSAWaitMultiObjects说明的最后,我找到了下面这段话:
    There seems to be a typo in the Remarks section. It is mentioned that the API would return WSA_IO_COMPLETION. The correct return value as mentioned in Return Value section is WSA_WAIT_IO_COMPLETION
    在Google中搜索中WSA_IO_COMPLETION,还能找出好几页的结果,真是一群只知道转发的笨蛋啊。
    另一个问题,SleepEx后,并不能用判断WSA_WAIT_IO_COMPLETION的方法来决定是否IO结束。因为这时候可能由于主机速度快于客户端,导致IO区为空。如果认为此时就结束了IO操作,后面的数据就接收不到了。正确的做法是在完成函数CompletionROUTINE中,判断参数cbTransferred是否为0,当cbTransferred为0了,才表示IO为空,可以结束IO操作。

 

你可能感兴趣的:([转贴]再来发点牢骚)