我看一教材:xSocket重载了CSocket的onRecieve函数,然后把这个xSocket对象加入列表,然后就不管了,数据来了是谁调用这个xSocket对象的onRecieve函数?拿mfc的对话框来说,人家都有 dlg.doModel()函数来驱动这个对话框,这时候domodel去获取消息,然后查找消息映射表,然后调用对应函数(附带this指针)。但是这个重载csocket的xSocket类是什么函数开始驱动这个socket,然后调用onReciece函数的?我唯一看到跟这个xSocket有关调用是Accept(*xSocketObject);然后就没下文了,数据来了自然调用onRecieve函数,并且附带this指针?为什么???
------解决思路----------------------
首先windows系统会接收到网络数据,并触发一个消息,比如WM_SOCKET_NOTIFY
然后在回调的消息循环函数中开始处理这个消息及其附带的参数
这个处理的过程就是找到消息映射所对应的具体执行函数
就是这个xSocket对象的OnReceive函数啦
------解决思路----------------------
CSocket据说是阻塞的,但是以前看过一个帖子,据说MFC的这个类本质上也是非阻塞的,具体没用过,所以我就不针对这个类发表意见了。
但是我用过CAsyncSocket,这个类的本质就是类似WSAAsyncSelect来实现的,它内部细节的要求是,必须在一个有MFC窗口的线程上调用,MFC窗口消息循环内部封装了网络事件消息,最底层大概是WaitForMultipleObjects来等待事件,有事件到达时,会发送一条网络事件到相应的窗口中,然后MFC的窗口接收到网络事件之后,会根据wParam和lParam的值决定调用哪一个对象的哪一个虚函数,也就是你最终被转到你重载的函数上去。
对于WSAAsyncSelect来说其中wParam的值是SOCKET的句柄,lParam的高16位表示这个SOCKET上的错误,低16位表示网络事件。
我不知道CAsyncSocket的网络事件是不是基于WSAAsyncSelect来发送消息的,如果是的话,在网络事件层次,就要进行一次查表,应该会很不效率,但是如果微软有什么没公开的手法可以直接传递对象指针而不是SOCKET的话,也许就不用查表。