WSAAsyncSelect函数模型

   以前学习的时候,看到select模型。说可以跨平台,哇,觉得真的很不错,学了它我可以在WINDOWS上和UNIX上都可以编程了。该模型就是神啊。其实,一直在犯一个错误。大多数时候,编程都是基于某一个平台的,而起某些基于某一平台的东西往往在效率上要比那些非专业的要强一些。select在WINDOW中的所有网络模型中,其效率应该算最低的了。恩,以前我还一直拿着不放呢。跨平台,多好啊,但是只是自己对技术上的一个向往吧,其实自己在UNIX上只是随便捣鼓个两下,还没真正的编写过一个程序呢。说多了。

  今天之所以学习WSAAsyncSelect模型,是因为工作中使用到了,以是在今天,才真真能够在脑海中清晰地把使用WSAAsyncSelect进行编程的所有步骤都反映出来。以前以是看了一遍一遍的,总是无法深刻的记下啊。真是,什么东西只用真正用到了才会深刻啊。

 

首先来说,WSAAsyncSelect模型比select模型效率要高,让你学习增加点兴趣吧。

其次,使用上个人感觉也比较思路清晰,简单,不像select那个一个宏两个宏的用。

下面就写一写使用步骤吧:

1、作为服务器端,监听套接字是必须的吧:创建套接字(socket)、绑定套接字(bind)、监听(listen)。假设为ListenSocket

2、服务器开始监听客户端了,那我们就要判断什么时候有客户端连接进入,这就该WSAAsyncSelect函数出场了。

WSAAsyncSelect(ListenSocket,hWnd,WM_WINDOWSOCK,FD_ACCEPT);

下面解释一下该函数参数:

ListenSocket就是我们创建的监听套接字,我们就是要判断什么时候有客户端向它发起连接,当让要用它做参数了。

FD_ACCEPT是第四个参数,放在这讲好理解前面两个参数。WSAAsyncSelect的第四个参数还有其他的值可取如FD_CLOSE等,可以看该函数。但是既然在这里套接字进入监听状态,它要了解的是现在那个客户端要向我发起连接,于是它就只关心FD_ACCEPT,也就是有客户端发起连接是,就通知我。但是,通知我,怎么通知,到哪里去找我呢,于是前面的连个参数就是在告诉怎么把有客户端接入的事件通知出去。

hWnd窗口句柄,就是说要通知就找到我把。

WM_WINDOWSOCK是一个消息。四个参数连接起来就是说,如果在ListenSocket上发生了FD_ACCEPT事件的时候,就像hWnd窗口发送WM_WINDOWSOCK消息,让它去处理。

 

要把消息发送到hWnd窗口来让它处理,它是如何处理的呢。

首先,既然是以消息方式发送给该窗口,那它应该就要接收该消息吧。

声明函数afx_msg void OnWindowSock(WPARAM wParam,LPARAM lParam);

映射消息ON_MESSAGE(WM_WINDOWSOCK,OnWindowSock);

现在有hWnd窗口的OnWindowSock函数来处理发送过来的消息,简单看一下他的实现:

void XX(窗口类)::OnWindowSock(WPARAM wParam,LPARAM lParam)

{//每个参数具体信息可以看WSAAsyncSelect函数部分的讲解

    switch(WSAGETSELECTEVENT(lParam)

     {

       case FD_ACCEPT://在此处就是处理接受客户端连接进来事件了吧

                SOCKET sock = accept((SOCKET)wParam,NULL,NULL);//为客户端分配一个套接字进行通信

             WSAAsyncSelect(sock,m_hWnd,WM_WINDOWSOCK,FD_WRITE | FD_READ);//在刚分配的套接字上设置感兴趣的事件

                //同上面讲的相同,只是不是同一个套接字了。

                   break;

       case FD_WRITE://是否可写

                break;

        case FD_READ://是否可读

                break;

     }

}

在此处要说明的是,也是我当初学习时感到难以理解的,为什么上面一个是ListenSocket是ACCEPT ,下面一个sock是FD_WRITE | FD_READ 其实主要就是要理解这两个套接字的区别。ListenSocket是一个监听套接字,等待有客户端进行连接,而sock是客户端连接进来后,要继续和他们进行通信,那就要给这个连接分配一个套接字负责了,所以每有一个客户端进来,就多一个sock套接字,而ListenSock只有一个,一直负责处理新的客户端的请求连接。

 

 

 

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值