MFC socket编程基础

本文介绍了MFC中CAsyncSocket的异步非阻塞工作原理,通过创建CSocketWnd窗口并使用WSAAsyncSelect将Socket事件关联,当发生事件时,回调相应函数。CAsyncSocket的派生类只需在OnReceive(), OnSend(), 等函数中处理。对于初学者易误解的WSAEWOULDBLOCK错误,文章指出不应视为错误,而应在OnConnect()等事件中等待结果。此外,讲解了CSocket如何通过消息循环变为同步阻塞,并展示了Connect(), Send(), Receive()等函数在遇到WSAEWOULDBLOCK时的处理方式。最后,讨论了服务端如何在OnAccept()事件中接受新的连接。" 129210265,7337247,RPA技术在各行业的应用:10大受益领域,"['人工智能', 'RPA', '自动化', '行业应用']

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

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值