CAsyncSocket
看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事件被指定以后,这个Socket默认就被用作了异步方式。那么CAsyncSocket内部到底是如何将事件交给你的呢?
CAsyncSocket的Create()函数,除了创建了一个SOCKET以外,还创建了个CSocketWnd窗口对象,并使用WSAAsyncSelect()将这个SOCKET与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调CAsyncSocket::OnReceive(),CAsyncSocket::OnSend(),CAsyncSocket::OnAccept(),CAsyncSocket::OnConnect()等虚函数。所以CAsyncSocket的派生类,只需要在这些虚函数里添加发送和接收的代码。
简化后,大致的代码为:
bool CAsyncSocket::Create( long lEvent ) //参数lEvent是指定你所关心的Socket事件
{
m_hSocket = socket( PF_INET, SOCK_STREAM, 0 ); //创建Socket本身
CSocketWnd* pSockWnd = new CSocketWnd; //创建响应事件的窗口,实际的这个窗口在AfxSockInit()调用时就被创建了。
pSockWnd->Create(...);
WSAAsyncSelect( m_hSocket, pSockWnd->m_hWnd, WM_SOCKET_NOTIFY, lEvent ); //Socket事件和窗口关联
}
static void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
CAsyncSocket Socket;
Socket.Attach( (SOCKET)wParam ); //wParam就是触发这个事件的Socket的句柄
int nErrorCode = WSAGETSELECTERROR(lParam); //lParam是错误码与事件码的合成
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
pSocket->OnReceive(nErrorCode);
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);
break;
case FD_OOB:
pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);
&nb
MFC socket编程基础
最新推荐文章于 2022-01-12 16:28:00 发布
本文介绍了MFC中CAsyncSocket的异步非阻塞工作原理,通过创建CSocketWnd窗口并使用WSAAsyncSelect将Socket事件关联,当发生事件时,回调相应函数。CAsyncSocket的派生类只需在OnReceive(), OnSend(), 等函数中处理。对于初学者易误解的WSAEWOULDBLOCK错误,文章指出不应视为错误,而应在OnConnect()等事件中等待结果。此外,讲解了CSocket如何通过消息循环变为同步阻塞,并展示了Connect(), Send(), Receive()等函数在遇到WSAEWOULDBLOCK时的处理方式。最后,讨论了服务端如何在OnAccept()事件中接受新的连接。"
129210265,7337247,RPA技术在各行业的应用:10大受益领域,"['人工智能', 'RPA', '自动化', '行业应用']

最低0.47元/天 解锁文章
2463





