在网上找了个WSAEventSelect的通信模型, 下面有些代码小弟看不懂, 请老手指教:
Index = WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index = Index - WSA_WAIT_EVENT_0;// 下面的for循环的意义是什么? 上面函数返回的index不就是发生网络事件的对象的索引了吗, 为什么不直接跳到
    WSAEnumNetworkEvents 函数呢??? 
for(i = Index;i < EventTotal;i++)
   {
Index = WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);
if((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT))
continue;
       else
       {
 Index = i;
 WSAEnumNetworkEvents(sockAcceptArray[Index], EventArray[Index],&NetworkEvents);
         .... ....
另外,看资料说等待的事件只能有64个, 再除开一些FD_READ,FD_WRITE,那么FD_ACCEPT事件只能少于64个, 是否意味着同时只能有少于64个的客户端连接服务器???  

解决方案 »

  1.   

    这个问题看书,Windows网络编程,找找IO模型那章,我们几句话说清楚了,你也未必真的会理解啊,还是看书去吧。
      

  2.   

    同时等待多个事件的函数对于事件个数是有限制的,与操作系统有关,XP限制是64,以免浪费系统资源。对于多于64个的情况,可以做一个循环,用多个等待函数分开处理,把等待时间设置为0或者较小的数,如果等待函数返回为超时就等待下一组事件,如果等待时间都设置为0,则循环中需要Sleep一下,以免CPU占用率过高。
      

  3.   

    看了windows网络编程的代码,里面似乎没有这个for循环, 所以我才有此一问.里面还提到:
     假如想让这个模型同时管理不止64个套接字,必须创建额外的工作者线程,以便等待更多的事件对象.  这句和楼上的回答都比较抽象, 能否通俗简单的介绍一下思路? 是不是我要多建几个EventArray ? 而所谓的64的限制, 就是WSAWaitForMultipleEvents函数中第一个参数不能大于64, 是否是这个意思?
      

  4.   

    64是Wait~ API的限制,不是Socket API的问题。
      

  5.   

    其实我的问题就两个: for循环的含义 ,  以及该模型是否可以适应几百个客户端连接服务器. 如果可以(应该是可以的), 请简单而具体说一下我该如何做.. 
      

  6.   

    WSAWaitForMultipleEvents是返回第一个得到通知的时间的序号,但具体是哪几个事件得到通知,是下面的for循环来做的事情,另外这个模型是不使用与很多客户端连接的,因为这个函数只能等64个事件,你可以使用多线程加这个函数的方法达到多客户端或使用iocp.
      

  7.   

    补充上面因为WSAWaitForMultipleEvents有64的限制,所以你可以把你所有的客户端连接分组,一组64个,然后每组用一个线程来wait,当然这也不是什么好方法,如果你确实有大量的客户端,采用iocp,不过比较复杂。
      

  8.   


    1.for内的含义就是循环地枚举64个连接的事件通知(每个只是等待1秒)
    2.可以适应几百个连接,但你必须要开多个线程去处理这么多连接,因为每个线程只能最多处理64个连接.例如你要处理300连接,那你至少要开6个线程去处理这么多连接.
      

  9.   

    谢谢! 每个等待一秒是否会导致响应过慢? 那个参数设置为0 有没有问题?   需求大概就是几百个连接. 需要用iocp吗? 对iocp完全不熟悉. 或者有没有其他简单一些的通信模型 ?
      

  10.   

    WSAWaitForMultipleEvents的第1参数不能大于WSA_MAXIMUM_WAIT_EVENTS(目前是64)。
    上面的for循环,是每次循环等待一个事件,如果事件发生则进行处理,但等待时间1000太长了,无法及时响应。用这种方法可以处理大于64个事件,可以不开多线程,但当连接很多时,为了及时响应还是要考虑用多线程的。
      

  11.   

    把for循环里的代码改成下面的样子是符合逻辑的
    Index = WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,0,FALSE); 
    如果你只有几百的话,不需要使用iocp,直接用标准select模型,然后在你包含ws_32.h前,定义
    #define FDSIZE 1024
      

  12.   

    写错了,应该是
    #define FD_SETSIZE 1024
      

  13.   

    select模型 或 WSAEventSelect + 多线程 .  暂时就考虑这两种的一种吧. 谢谢各位, 结贴给分了.
      

  14.   

    如果单个select或WSAEventSelect()可以很好有效率地处理几百,上千连接,微软就不会默认下设置为只能处理64连接.