小弟初次做一个服务端程序,发现效率比较低下,比如处理一个SOCKET连接的通信需要100毫秒,而处理十个就要1000毫秒
我是侦听到一个连接请求就使用MFC的CAsyncSocket开一个连接对象,然后响应OnReceive进行处理。请问:我是不是应该开多线程处理,一般象这种服务程序是如何解决这些问题的,能够容纳多少个线程?还有,这样开多线程,一有处理CPU占用老是100%,有没有好的解决方法?
小弟是个菜鸟,希望大侠们多多指教,先行谢过了!

解决方案 »

  1.   

    据我所知,CAsyncSocket类用在多线程里....麻烦!
      

  2.   

    根据你所说的。我猜测你先开始用的是一个TCP连接的Socket(不然哪来的“侦听到一个连接请求”)。收到一个连接请求之后,我不明白你为什么要“使用MFC的CAsyncSocket开一个连接对象”?  ,你新建一个对象,要调用构造函数,并初始化。用的时间当然要长了。
    你不知道Socket有accept函数么?
       还有,开新线程要谨慎,要看看性能的瓶颈在哪里。如果在套接字,那就多开套接字。如果在处理信息部分,那就可以多处理消息的开线程。
      

  3.   

    我喜欢用UDP套接字。,重载OnReceive函数。
    先把消息收下来再说。让后台的工作线程慢慢处理去。
    要知道,如果你接受消息慢的话,有可能造成信息的丢失。
      

  4.   

    to:wj_xiazi 自然是有一个负责ACCEPT连接的CAsyncSocket对象了,这样通过他收到一个连接请求后就新建一个CAsyncSocket连接对象了。
    希望大家再帮我想想办法!我的想法是肯定是要开多线程,一个连接开一个线程,这样可行吗?
      

  5.   

    对呀!服务器端就是为每个连接开一个线程来处理的,首先CAsyncSocket本身就是多线程的,OnAccept的时候每收到一个新的连接,就开一个新的线程。
      

  6.   

    CAsyncSocket本身就是多线程的,真的吗?
      

  7.   

    CAsynSocket是单线程的,只是每一个连接添加一个对象而已线程要你自己写
    不过不推荐线程方法。因为无论你线程再多,同时能够执行的线程数取决于你CPU的数量而且,创建/释放线程资源是很浪费系统的
      

  8.   

    CAsynSocket隐藏了一个消息处理窗口,OnReceive,OnAccept等都是窗口消息响应函数。
    当你创建CAsynSocket对象后,它就有一套自己的消息循环,所以,你可以把它理解为多线程,因为一般情况下,不影响主界面消息循环,除非CAsynSocket对象消息特别多以至于来不及处理,这种情况繁忙的服务器很容易发生。  要想写高效率的服务器,建议用异步I/O,或完成端口。
      

  9.   

    呵呵!
    (由于CAsynSocket本身是多线程的,因此对于每个客户,服务器就有一个单独的线程再和它通信,因此服务器可以同时对多个客户进行服务。)__引自 <Visual C++网络高级编程>
                              
    现在服务器一般就是一个连接开一个线程吧,还有别的办法吗?我也在做webserver,我也想study一下,不过服务器的例子网上有很多。
      

  10.   

    楼上的去读一下关于完成端口相关的书籍
    大型的webserver如果都开线程这么做,早就死菜了
      

  11.   

    开那么多线程的话不是叫别人来黑你嘛..........你的CPU的资源是有限滴