大家TCP服务器都用什么线程模型啊,能处理多少客户端啊? 1。单线程2。固定线程数,比如说TCP服务器一个监听线程,一个读线程,一个处理线程,一个写线程,这样是否合理?3。每个客户端一个线程4。完成端口 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请各位把服务器能处理的客户端的数量也告之-------------------------------------------如果是用短连接的,理论上可以无数个啊。要看实际应用的。一般选择完成端口。如果考虑扩展性,还会有中间层的,soap之类的。 我也知道用IOCP开发的服务器伸缩性不错但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端 我也知道用IOCP开发的服务器伸缩性不错但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端-----------------------------一般用3的都很少,如果有1000个用户就是1000个线程,光线程调度就够化资源了。在100个以下么勉强接受。2的话,如果是客户的请求不是很频繁,比如平均每秒内请求数量不超过5个,数据量比较小,数据处理简单的情况下,300头左右没有问题的,还要看配置的。除了上面说的几种, 像event通知模式也可以,编程也简单。 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的前提下把它从完成端口里面移出。 我写的socks5代理程序,最高记录是800多并发连接,CPU使用率是34%.CPU是P4的2.8Ghz. VC6.0中显示JPEG图像 编译时常遇到的问题 如何设置菜单响应时间? 注入的DLL如何调用宿主函数? 为什么声明Input类型的变量编绎不过 如何确定操作系统的简繁体版本? 急告:怎样向打开的批处理文件的命令提示符界面中输入参数 菜鸟发问(在线) 如何获取框架的状态栏指针? 为什么我的vc装不了vs6sp5呢? 请问怎样获得Win98下硬盘序列号?回复的方法一定要可行,可排除SCSI硬盘。 多线程环境下阻塞与非阻塞
-------------------------------------------
如果是用短连接的,理论上可以无数个啊。要看实际应用的。一般选择完成端口。如果考虑扩展性,还会有中间层的,soap之类的。
但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端
但我不知道2和3在实际应用中用的多不多,一般适合于处理多少客户端
-----------------------------
一般用3的都很少,如果有1000个用户就是1000个线程,光线程调度就够化资源了。在100个以下么勉强接受。2的话,如果是客户的请求不是很频繁,比如平均每秒内请求数量不超过5个,数据量比较小,数据处理简单的情况下,300头左右没有问题的,还要看配置的。除了上面说的几种, 像event通知模式也可以,编程也简单。
当接收到包时,对使用poll in的socket(UDP)接着就投递另一个recv,对不使用poll in的socket(TCP),由业务层负责投递recvwindoze下面可以使用重叠IO,linux下面可以使用poll/epoll,IO模型相同
完成端口有点麻烦,有人提出DuplicateHandle()可以在不关闭socket的前提下把它从完成端口里面移出。