1)利用WSAEventSelect模型时候,WSAWaitForMultipleEvents()函数是在OnTimer()调用么?有没必要为它单独开一个线程?2)重叠模型通过“事件对象通知”管理IO时候,要先接受一个入站连接(newSock = accept(sSock,NULL,NULL)),然后再做相关的WSAOVERLAPPED设置。但是,服务器无法知道什么时候有新的连接到来,即不知道要在什么时候调用accept函数。请问,在一(Server)对多(Client)通信时候,利用这种IO模型该在哪里调用newSock = accept(sSock,NULL,NULL)比较合适?谢谢

解决方案 »

  1.   

    说说我的做法。
    2)
    服务器端,如果基于MFC,采用CAsyncSocket来做的话,那没啥好说的,就重载其OnAccept函数,在里面调用Accept即可。
    如果用WinSock来写,则创建一个线程,专门用于socket事务处理,首先创建一个侦听器(listener),然后开始侦听,该线程的函数调用类似于:
    while (true)
    {
        //检测是否有事件发生
        select(...);
        //如果是read事件,检测是否accept请求
        //否则读取数据
        //如果是write事件,检测是否有数据要发送
        //检测是否有socket被关闭了。
    }
      

  2.   

    1)利用WSAEventSelect模型时候,WSAWaitForMultipleEvents()函数是在OnTimer()调用么?有没必要为它单独开一个线程?我觉得还是开一个线程好一点,因为你可能还要做其它的事情,要是让WSAWaitForMultipleEvents
    阻塞在那里的话就做不了了,当然你可以设置超时,但是还是开一个线程在结构上要合理一点,
    呵呵,个人观点.2)重叠模型通过“事件对象通知”管理IO时候,要先接受一个入站连接(newSock = accept(sSock,NULL,NULL)),然后再做相关的WSAOVERLAPPED设置。但是,服务器无法知道什么时候有新的连接到来,即不知道要在什么时候调用accept函数。请问,在一(Server)对多(Client)通信时候,利用这种IO模型该在哪里调用newSock = accept(sSock,NULL,NULL)比较合适?既然是重叠模型,那么在有连接进入的时候就会有相应的FD_ACCEPT事件触发,你在对该事件的响应函数那里加上连接的accept函数调用也就行了,这没什么好说的.