MFC socket编程基础

CAsyncSocket         看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事件被指定以后,这个Socket默认就被用作了异步方式。那么CAsyncSocket内部到底是如何将事件交给你的呢?         CAsyncSocket的Create()函数,除了创建了一个S
摘要由CSDN通过智能技术生成

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);
                     break;
                case FD_CONNECT:
                     pSocket->OnConnect(nErrorCode);
                     break;
                case FD_CLOSE:
                     pSocket->OnClose(nErrorCode);
                     break;
            }
   }

   CSocketWnd类大致为:

<

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值