異步網路事件

當網路事件發生時,“socket視窗”接收WM_SOCKET_NOTIFY訊息,訊息處理函式OnSocketNotify被調用。“socket視窗”的定義和訊息處理是MFC實現的,這裡不作詳細的討論。
OnSocketNotify回調CAsyncSocket的成員函式DoCallBack,DoCallBack調用事件處理函式,如OnRead、OnWrite等。摘錄DoCallBack的一段代碼如下:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
DWORD nBytes;
//得到可以一次讀取的位元組數
pSocket->IOCtl(FIONREAD, &nBytes);
if (nBytes != 0)
pSocket->OnReceive(nErrorCode);
}
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);
break;
case FD_OOB:
pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);
break;
case FD_CONNECT:
pSocket->OnConnect(nErrorCode);
break;
case FD_CLOSE:
pSocket->OnClose(nErrorCode);
break;
lParam是WM_SOCKET_NOFITY的訊息參數,OnSocketNotify傳遞給函式DoCallBack,表示通知事件。
函式IOCtl是CAsyncSocket的成員函式,用來對socket的I/O進行控制。這裡的使用表示本次調用Receive函式至多可以讀nBytes個位元組。
從上面的討論可以看出,從創建socket到網路I/O,CAsyncSocket直接封裝了低層的WinSock API,簡化了WinSock編程,實現了一個異步操作的界面。如果希望某個操作是阻塞操作,則在調用Create時不要指定該操作對應的網路事件。例如,希望Connect和Send是阻塞操作,在任務完成之後才返回,則可以使用如下的語句:
pSocket->Create(0, SOCK_STREAM,
FR_WRITE|FR_OOB|FR_ACCEPT|FR_CLOSE);
這樣,在Connect和Send時,如果是用戶界面執行緒的話,可能阻塞執行緒訊息循環。所以,最好在工作者執行緒中使用阻塞操作。

相關詞條

熱門詞條

聯絡我們