最近看《Windows网络编程》,很奇怪的是书中居然没有给出一个实用的多连接的例子!不由得大失所望。原想自己动手做一个,试了试,发现竟有很多困惑----是否应该使用多线程?是一个连接对应一个线程还是多个线程共一个线程?在MFC程序中如何产生一个窗口供响应SOCKET消息用?是一个线程一个窗口还是所有的SOCKET共用同一个窗口?如果网络通讯非常繁忙的话,单线程、单SOCKET窗口的效率如何,能及时处理所有的数据据吗?如此种种,真是满头雾水!都说做网络程序用API是最好的,对此嘿嘿,苦笑。欢迎四方高手畅谈,尤其是实际做过此类程序的朋友。

解决方案 »

  1.   

    朋友,那是因为你不懂的用API的winsock,你用select或完成端口模式都可以完成多链接,还有WSAEventSelent等都可以完成多链接,WSAAsyncSelect模型完成多链接好像不大方便,我还用过
      

  2.   

    更正:WSAAsyncSelect模型完成多链接好像不大方便,我没用过
      

  3.   

    SinAngel(纹身女孩) :[email protected]非常感谢!
      

  4.   

    SinAngel(纹身女孩) :  不介意也发一份给我吧
    [email protected]非常感谢!BIND 兄:我没有用API的方法做过,用的 CAsyncSocket 做的,服务端做一个列表,当有客户请求连接时NEW 一个新的CCLIENT ,这个类用来和客户通信,他自已被保存在列表中。        客户端连接多个服务器时是这样做的,做了一个 CStation 类,在这个类中生成定义的数目的客户 SOCKET 每个客户 SOCKET 连接一个服务器,如果发现断线或不通则自已清除自已,再生成一个 SOCKET 再连        过程就是这样,现在用于江西的监控网络,还可以,没有问题,速度也不错,断线还可以自已重连
      

  5.   

    我知道你说的意思了,这个问题我当时也试过,不过后来因为太麻烦就没有作了,这就是你问的第二个问题中的内容吧,我也回了一个我后来就是用 CAsyncSocket 做的,当时线程不对,只能有一个 SOCKET 和你们一起讨论,改过来了就好了。去看看
      

  6.   

    写服务器端的程序确实要考虑的问题太多了...
    是不是用多线程是两个方面的考虑.
    1) 让CPU的IDLE时间减少, 比如一个线程在做IO的时候, 可以有另外的线程投入运行
    2) 你所使用的模型的局限, 比如你用WSAEventSelect的话, 一个线程最多处理64个连接. 
    你使用这个模型没有什么问题的, 它使用窗口的消息队列做并发访问的串行化, 不限制连接的数量. 但性能不太好...
    如果你的程序有移植性的考虑, 比如在UNIX/LINUX平台上运行. 就用select好了, 如果你的应用可以指定你的服务器的运算能力及操作系统的话就用完成端口. 剩下来的一些不大的应用就用AsyncSelect好了. 其实传奇游戏的服务器端用Delphi写的, 用的就是这个模型, 所以速度... :)
      

  7.   

    那么在WINDOWS平台上做这种服务器用哪种模型比较好呢?完成端口是不行的,我的程序还得在WIN98上跑啊!
      

  8.   

    bqt(汤姆) :请说得详细一些。
      

  9.   

    建一个线程池,有连接来的时候由空闲的线程处理,建立的连接放到连接池里,由Hash Table维护。socket线程有消息时,也可以调用窗口函数进行处理,窗口函数找到相应的连接进行处理!我觉得应该用一个窗口。
    我是通过异步处理,不过直接用自己封装的API.
      

  10.   

    我又来了 BIND  为什么要自己做API呢?这个我不能直接说明,我没有作过
    用 AsyncSocket 就可以了,我做了一个现成的,用得很好
      

  11.   

    Saimen,我以前一直用的CAsyncSocket,对这个类还是比较熟悉的。之所以改用API,一来是可以学习新东西,二来听说是“好的服务器都是用API做的”(嘿嘿苦笑),三来MFC确实有些讨厌的地方,很多的黑箱操作弄得人云里雾里很是不爽,比如(_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;这样的东东),虽然MFC用起来的确比较容易,但是一旦它罢工了,我们都搞不清楚为什么。不知你有没有越到过CAsyncSocket不响应任何消息的情况?
      

  12.   

    对了,还得谢你上午给我的例子!我大致看了一下,作者用的方法是所有SOCKET共用主窗口处理消息,我个人认为对SOCKET而言,这还是一个单线程的程序。
      

  13.   

    see this
    http://tangentsoft.net/wskfaq/examples/basics/select-server.html
      

  14.   

    SinAngel(纹身女孩) :[email protected]非常感谢!
      

  15.   

    SinAngel(纹身女孩) 请问你什么时候发呀?我到现在都还没收到
      

  16.   

    是否应该使用多线程?是一个连接对应一个线程还是多个线程共一个线程?
    _________
    都可以.在MFC程序中如何产生一个窗口供响应SOCKET消息用?是一个线程一个窗口还是所有的SOCKET共用同一个窗口?
    ________
    共用.如果网络通讯非常繁忙的话,单线程、单SOCKET窗口的效率如何,能及时处理所有的数据据吗?
    _______
    有完成端口可用.
      

  17.   

    呵呵,如果单线程都处理不过来,多线程如何处理的过来?对于单处理器来说,任何操作本质上都是分片轮询的。
    在win32下,用完成端口!
      

  18.   

    完成端口是不能考虑的,因为WIN98不支持啊!
      

  19.   

    to Bind(天高云淡) 
       >>>>>完成端口是不能考虑的,因为WIN98不支持啊!
     
    完成 端口的本质就是线程池,win98下自己做一个,呵呵。
      

  20.   

    sufeng(sufeng) 多谢指点并非常敬佩格下为人!