通过Reflector和.net的反射机制来探索和使用.net framework未文档化的API
.net framework对Windows API进行了一层封装,但是有的时候我们会感觉封装的太厚了,失去了一些功能和灵活性。
比如在NCindy里面,我希望能充分利用IOCP,包括Accept一个新的连接。
《Network Programming for Windows/2e》第6章的“Scalable Server Architecture”对一个高伸缩性服务器是应该如何Accepting Connections有一段这样的话。
On Windows 2000 and later versions, Winsock provides a mechanism for determining if an application is running behind in posting adequate AcceptEx calls. When creating the listening socket, associate it with an event by using the WSAEventSelect API call and registering for FD_ACCEPT notification. If there are no pending AcceptEx operations but there are incoming client connections (accepted by the system according to the backlog value), then the event will be signaled. This can even be used as an indication to post additional AcceptEx operations.
可以我找遍Socket类的里里外外都找不到WSAEventSelect API ,但是我对程序的直觉告诉我,这么重要的一个API,.net内部应该会用到。但是,如何证明我的直觉呢?非常感谢Reflector for .NET,它给了我们分析.net framework内部实现的可能。如果没有它,我是在无法工作下去了。
打开Reflector,从.net framework的System Assembly中搜索WSAEventSelect。果然,这个API被实现在一个隐蔽的角落“System.Net.UnsafeNclNativeMethods+OSSOCK”
接着,我们要分析这个API是被如何使用的,在Reflector左边的树图中右键点击WSAEventSelectf方法,选择Analyzer,在右边展开Userd By节点,这里列出了所有使用WSAEventSelect方法的方法、属性。看看.net 内部的实现,该如何使用WSAEventSelect遍了然于胸了。
最后,使用反射调用这个隐蔽的方法。具体如何用,大家还是去参考NCindy的代码吧,或者最直接的,看看NCindy/Example/EchoServer2的实现就可以了。
posted on 2006-09-06 09:45 iceboundrock 阅读(548) 评论(0) 编辑 收藏 举报