深入了解异步套接字

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

深入了解异步套接字

CAsyncSocket异步套接字是MFC封装的SOCKET的类。

只有在三种条件下,才会发出FD_WRITE通知:

1、使用connect或WSAConnect,一个套接字首次建立了连接;

2、使用accept或WSAAccept,套接字被接受以后;

3、若send、WSASend、sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误

,而且缓冲区的空间变得可用。

因此,一个应用程序自收到FD_WRITE消息开始,便认为自己必然能在一个套接字

上发出数据。

所以系统是通过掩码(例:FD_WRITE)来通知异步套接字消息响应函数的。

在实例程序中,经过设置断点调试得知系统会在如下的函数中处理异步消息:

void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)

{

if (wParam == 0 && lParam == 0)

return;

// Has the socket be closed?

CAsyncSocket* pSocket =

CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE);

// If yes ignore message

if (pSocket != NULL)

return;

pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);

if (pSocket == NULL)

{

// Must be in the middle of an Accept call

pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET,

FALSE);

ASSERT(pSocket != NULL);

pSocket->m_hSocket = (SOCKET)wParam;

CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);

CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket,

FALSE);

}

int nErrorCode = WSAGETSELECTERROR(lParam);

switch (WSAGETSELECTEVENT(lParam))

{

case FD_READ://如果来的异步消息FD_READ,就准备触发OnReceive() 函数

{

DWORD nBytes;

if (!pSocket->IOCtl(FIONREAD, &nBytes))

nErrorCode = WSAGetLastError();

if (nBytes != 0 || nErrorCode != 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;

}

}

从以上的代码可以看出,MFC是通过DoCallBack()这个函数来处理异步网络事件。

当我们用

AsyncSelect(FD_READ);的话,一旦成功,系统将会触发函数

OnReceive(nErrorCode);

同样FD_WRITE对应函数OnSend(nErrorCode);

同样FD_ACCEPT对应函数OnAccept(nErrorCode);

同样FD_CONNECT对应函数OnConnect(nErrorCode);

同样FD_CLOSE对应函数OnClose(nErrorCode);

同样FD_OOB对应函数OnOutOfBandData(nErrorCode);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航