今天看了本书上的例程,做的是局域网聊天工具,用的Socket知识。前面介绍了Socket相关的函数,这些之前都了解。不过真正实现的时候却是用了封装的CSocket类,然后绕来绕去感觉一头雾水,花了好长时间研究了它的代码。
首先它的主类继承自CSocket类,然后注意到重载了三个函数:
virtual void OnReceive(); //接收到数据
virtual void OnClose(); //关闭
virtual void OnAccept(); //接收新用户
然后在这三个重载的函数的实现是分别发送SOCKET_EVENT消息给窗口:
pWnd -> SendMessage(SOCKET_EVENT,(long)this,RETR/CLOSE/ACCEPT);
接着,程序定义了消息SOCKET_EVENT,并定义了消息映射:
ON_MESSAGE(SOCKET_EVENT,OnSocket)
最后添加OnSocket函数进行消息处理。处理中对消息的lParam进行switch-case判断处理。
那么现在,我的理解是:那三个重载的函数,应该是CSocket类中封装好的,自己创建了线程在里面,例如一旦缓冲区接收到消息,它就会自动调用OnReceive函数,启动接收的线程,原理应该和串口控件MSComm一样的。重载之后,一旦自动调用,会发不同参数的消息给窗口,最后窗口对消息进行判断处理。而对于Send功能怎没有对应的线程,而是定义个按钮作为启动事件。一般都是把Send作为主动功能,而Receive作为线程。
另外,程序使用了CS架构编写,和我之前看的P2P不一样,主要是服务器端是负责转发的功能,因此会先Receive读取数据,再Send转发数据。转发还分群发和私聊。而客户端这边Receive和Send是分开的,都是和服务器发生关系。
原文地址:http://blog.csdn.net/hunterlew/article/details/41344809