• 1.摘要
  • 2.基本信息
  • 3.简介
  • 4.参数
  • 5.结束语
  • 6.注释

非阻塞模式

非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。

基本信息

  • 中文名

    非阻塞模式

  • 释义

    利用socket事件的消息机制Server端与Client端之间的通信处于异步状态

简介

在非阻塞模式下利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态下。

通常需要从CSocket类派生一个新类,派生新类的目的是重载socket事件的消息函数,然后在socket事件的消息函数中添入合适的代码以完成Client端与Server端之间的通信,与阻塞模式相比,非阻塞模式无需创建一个新线程。

这里将讨论当Server端socket事件-FD_ACCEPT被触发后,该事件的处理函数OnAccept是如何进一步被触发的。其它事件的处理函数如OnConnect,OnReceive等的触发方式与此类似。

在1中已提到Client/Server端通信时,Server端socket正在接收来自Client端socket连接请求,这将会触发FD_ACCEPT事件,同时Server端的网络传输服务进程向Server端的socketwindow(CSocketWnd)发送事件通知消息WM_SOCKET_NOTIFY,通知有FD_ACCEPT事件产生,CsocketWnd在收到事件通知消息后,调用消息处理函数OnSocketNotify:

LRESULTCSocketWnd::OnSocketNotify(WPARAMwParam,LPARAMlParam)

{

CSocket::AuxQueueAdd(WM_SOCKET_NOTIFY,wParam,lParam);

CSocket::ProcessAuxQueue();

return0L;

}

参数

消息参数wParam是socket的句柄,lParam是socket事件。这里稍作解释一下,CSocketWnd类是作为CSocket类的友元类,这意味着它可以访问CSocket类中的保护和私有成员函数和变量,AuxQueueAdd和ProcessAuxQueue是CSocket类的静态成员函数,如果你对友元不熟悉,请迅速找本有关C 书看一下友元的使用方法吧!

ProcessAuxQueue是实质处理socket事件的函数,在该函数中有这样一句代码:

CAsyncSocket*pSocket=CAsyncSocket::LookupHandle((SOCKET)wParam,TRUE);

其实也就是由socket句柄得到发送事件通知消息的socket指针pSocket:从m_pmapSocketHandle中查找(见1)!

最后,WSAGETSELECTEVENT(lParam)会取出事件类型,在一个简单的switch语句中判断事件类型并调用事件处理函数。在这里,事件类型是FD_ACCEPT,当然就调用pSocket->OnAccept!

结束语

Server端socket处于阻塞调用模式下,它必须在一个新创建的线程中工作,防止主线程被阻塞。