1。单线程
2。固定线程数,比如说TCP服务器一个监听线程,一个读线程,一个处理线程,一个写线程,这样是否合理?
3。每个客户端一个线程
4。完成端口

解决方案 »

  1.   

    请各位把服务器能处理的客户端的数量也告之
    -------------------------------------------
    如果是用短连接的,理论上可以无数个啊。要看实际应用的。一般选择完成端口。如果考虑扩展性,还会有中间层的,soap之类的。
      

  2.   

    我也知道用IOCP开发的服务器伸缩性不错
    但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端
      

  3.   

    我也知道用IOCP开发的服务器伸缩性不错
    但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端
    -----------------------------
    一般用3的都很少,如果有1000个用户就是1000个线程,光线程调度就够化资源了。在100个以下么勉强接受。2的话,如果是客户的请求不是很频繁,比如平均每秒内请求数量不超过5个,数据量比较小,数据处理简单的情况下,300头左右没有问题的,还要看配置的。除了上面说的几种, 像event通知模式也可以,编程也简单。
      

  4.   

    IO线程就一个,业务线程数依需要而定,IO和业务处理通过队列分离。TCP类型的业务按需输入,不对缓冲输入(由OS的TCP/IP栈缓冲),处理业务时由业务线程暂时接管Socket,当作有限状态机来处理。当接收到一个数据包时,IO线程将数据包连同Socket一起放入队列,交给业务线程处理。(IO对象/Socket句柄可以设计成数据包的一个参数。)UDP类型的业务使用有限深度的队列缓冲输入,避免拥塞。万一队列溢出,可以抛弃先到或后来的包,看需要灵活处理就好了。我在IO对象上设置了一个标志:是否使用poll in
    当接收到包时,对使用poll in的socket(UDP)接着就投递另一个recv,对不使用poll in的socket(TCP),由业务层负责投递recvwindoze下面可以使用重叠IO,linux下面可以使用poll/epoll,IO模型相同
    完成端口有点麻烦,有人提出DuplicateHandle()可以在不关闭socket的前提下把它从完成端口里面移出。
      

  5.   

    我写的socks5代理程序,最高记录是800多并发连接,CPU使用率是34%.CPU是P4的2.8Ghz.