本帖最后由 VisualEleven 于 2010-12-31 08:47:54 编辑

解决方案 »

  1.   

    wParam表示发生网络事件的套接字,根据它在OnSock中过滤
      

  2.   

    SOCKET sock = (SOCKET)wParam
      

  3.   

    When one of the nominated network events occurs on the specified socket s, the application window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word of lParam specifies the network event that has occurred. The high word of lParam contains any error code. 
      

  4.   

    本帖最后由 VisualEleven 于 2011-01-06 08:46:02 编辑
      

  5.   

    您好,我发表一下我的看法,希望能对您有用。在WSAAsyncSelectm这个模型之中,每当网络上有数据可以读取的时候,你的窗口this->m_hWnd都会收到一个消息WM_SOCKET(这个是你自己定义的),其中wParam代表一个SOCKET,这个SOCKET和你的远程客户相连,LOWORD(lParam)代表您想要处理的通知,在这个通知中您可以对远程客户进行验证,比如:
    每次客户端连上服务器的时候,都先发送自己的客户ID号码,这个时候在服务器的FD_READ中,您就可以
    收到这个客户ID,然后您可以用这个客户ID查找数据库,看是否存在这个客户ID,如果不存在发送客户一个通知,如果存在,您这个时候将这个客户ID和WPARAM这个SOCKET绑定,并且也要发送客户一个通知,当客户收到这个通知字符串的时候,就可以进行相应的处理了。当客户下线的时候,在您的FD_CLOSE中,您根据<SOCKET-客户ID>的在线客户链表,以SOCKET为关键字,然后再删除相应的<SOCKET-客户ID>,检测用户下线,可以使用心跳包。以上是我的见解,希望对您有用。
      

  6.   

    消息处理函数的wParam就是对应的socket
      

  7.   

    WSAAsyncSelect 的socket io模型效率不高的. cpu amd 3000+  内存2g winxp100个连接,连接每100毫秒发送一次数据4k到服务端,服务端收到后立即echo给客户
    服务端程序用cpu20% 周边 总计系统40%都在处理. 客户端边0-70毫秒的接收延迟. 内网测试再多开100连接.即200个客户连接,测试. cpu33-50% 周边  总计消耗系统70-80%  再多开一个连接,测试收发延迟,依然快速,0-70毫秒之间延迟,大部分0.
    再多开100连接.300个连接,进程占cpu 60-70%  管理器下的cpu使用已经100%了. 再多开一个连接测试收发延迟.达到了100-5000之间,一次发的越快越多,延迟越长。。
    看来基于窗口消息的sock模型也就只能满足100-300的小型网络服务了.