http://www.yesky.com/SoftChannel/72342371928702976/20030805/1719054.shtmlWinSock网络通信程序设计入门这个例子已经很好地说明了异步、非阻塞Socket遍程方法, 但是对于这样的基于事件的程序, 如何编制多线程处理呢?

解决方案 »

  1.   

    呵呵,看了一下,既然用了WSAAyncSelect模型就已经是异步的了根本就没有必要再用多线程了啊^_^可能是楼主还没有对这个模型理解透彻:)不知道楼主想怎么来使用多线程
      

  2.   

    你如何理解多个并发的线程共用窗口中的单独程序. 以及一下这段文字listen(sock,1);
    //开启线程避免主程序的阻塞
    AfxBeginThread(Server,NULL);
    ……
    UINT Server(LPVOID lpVoid)
    {
    ……
    int nLen=sizeof(SOCKADDR);
    pView->newskt=accept(pView->sock,(LPSOCKADDR)& pView->sockin,(LPINT)& nLen);
    …… 
    WSAAsyncSelect(pView->newskt,pView->m_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE);
    return 1; 
    }
       这里之所以把accept()放到一个线程中去是因为在执行到该函数时如没有客户连接服务器的请求到来,服务器就会停在accept语句上等待连接请求的到来,这势必会引起程序的阻塞,虽然也可以通过设置套接字为非阻塞方式使在没有客户等待时可以使accept()函数调用立即返回,但这种轮询套接字的方式会使CPU处于忙等待方式,从而降低程序的运行效率大大浪费系统资源。考虑到这种情况,将套接字设置为阻塞工作方式,并为其单独开辟一个子线程,将其阻塞控制在子线程范围内而不会造成整个应用程序的阻塞。对于网络事件的响应显然要采取异步选择机制,只有采取这种方式才可以在由网络对方所引起的不可预知的网络事件发生时能马上在进程中做出及时的响应处理,而在没有网络事件到达时则可以处理其他事件,这种效率是很高的,而且完全符合Windows所标榜的消息触发原则。前面那段代码中的WSAAsyncSelect()函数便是实现网络事件异步选择的核心函数。
      

  3.   

    哦呵呵,你是说这样使用啊,总之只要把监听函数放到另外的线程中就好了防止阻塞其实你也可以在在WSAAsyncSelect里面加上FD_ACCEPT事件,就不需要另外开监听线程Accept了,不过这样做也有这样做的缺点