一个TCP端口最多可以同时连接多少个客户端呢?
Posted 软若石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个TCP端口最多可以同时连接多少个客户端呢?相关的知识,希望对你有一定的参考价值。
pp616 ( 傻小子) 2003-12-08 17:54:11 在 C++ Builder / 网络及通讯开发 提问最近服务器程序。用的socket api
只接受连接什么事都不做。发现一个问题。
服务器只能接受3900多个Client端再多了就Accept不了了。
开始怀疑是服务器程序写的有问题。
后来我打开本机的http服务和ftp服务。
模拟Client去连接80 或是 21端口发现还是3900快到4000左右的Client连接上后再有Client去连接就怎么也连接不上了。WSAGetLastError和GetLastError都得不到任何信息,真是奇怪。
难道是win2k的限制?我用的win2k adv svr 我又怀疑是硬件限制,我的计算机C4-1.8 512MB-ddr.
后来我在p4-2G 1GB-DDR SCSI-36G硬盘 win2k adv svr 上测试还是快到4000就再也连接不上了。系统换成Win2003 server还是这样。
哎···没折了。大伙遇到过这问题吗。帮帮忙吧。
问题点数: 200、回复次数: 32 1楼 matq2008 ( 叶子.net) 回复于 2003-12-08 18:50:57 得分 10
俺从来没搞过这么大的用户数,一般在vc里listen最多是5,是同时的并发数,最多连接数是多少不知道
Top 2楼 del_c_sharp ( 武林中传说的摩托牛拉) 回复于 2003-12-08 19:32:26 得分 10
4000?的确不好发现,楼主是在实际项目中发现这个问题的,还是无意中测试发现的?
感觉和操作系统底层有关系,是否有可能是链路层的缓存环的问题?windows下是如何实现的
没有研究过。。。
Top 3楼 Raptor ( 猛禽) 回复于 2003-12-08 20:43:18 得分 10
好像是WIN的一个BUG,好像是改注册表一个什么地方可以,不过不记得了。
你试试看在线升级打上WIN的所有最新补丁看看。
Top 4楼 yuyulily ( 打工仔) 回复于 2003-12-08 20:59:06 得分 10
关注,俺从来没搞过这么大的用户数
Top 5楼 pp616 ( 傻小子) 回复于 2003-12-08 21:33:17 得分 0
所有的Windows Update都装了。
Top 6楼 constantine ( 飘遥的安吉儿) 回复于 2003-12-08 22:09:48 得分 10
顶
Top 7楼 TopCat ( 令狐虫) 回复于 2003-12-08 22:13:53 得分 0
我也没试过这么大的并发连接数,不过我觉得一般并发数不太可能到达这么高,如果真这么高的话应该考虑做负载平衡,而不是想办法提高并发数吧。
Top 8楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-08 23:36:33 得分 10
你用的是那种I/O模型;
Block?Asynchronize?Select?Overlapped?complition port?
每种I/O模型的性能表现(尤其连接数有很大的不同)。
从各种性能来看,完成端口的连接数最多。远远超过4000,(我忘了是多少了,明天给你个具体的数字)。
如果你要开发大型服务器,这几种模型约往后面性能越好,但实现也越复杂。
Top 9楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-08 23:48:45 得分 0
socket服务器并非我们想象的那样简单,如果你要开发巨连接数,高性能的服务器,要在I/O模型上下功夫,并非只是简单的socket,bind,listen,accept。
在没有搞懂下面的函数之前,别指望你的服务器会有很高的性能(我曾经发现我的tcp服务器的性能和连接数根本和人家的游戏服务器没法相比,后来才发现原因就在这里)
ioctlsocket,WSAAsyncSelect,WSACreateEvent,WSAEventSelect,WSAWaitForMultipleEvents,CompletionROUTINE,CreateIoCompletionPort,GetQueuedCompletionStatus。。。。。
Top 10楼 pp616 ( 傻小子) 回复于 2003-12-08 23:50:07 得分 0
我用的IOCP 连接数始终都是4000不到差几十。怎么也增不上去啊。
MS 的 IIS应该用的IOCP吧。连接也是不到4000差几十。真奇怪??
Top 11楼 ThinkX ( 秋天的树) 回复于 2003-12-09 00:04:04 得分 10
IOCP是windows下大并发服务器的唯一选择。
按照你的说法,可能是配置的问题吧,不知道这个和硬件配置是否有关系,也许硬件不够强大。
Top 12楼 yesry ( 噎死你) 回复于 2003-12-09 11:00:44 得分 0
gz
Top 13楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-09 12:10:30 得分 10
请说明您的tcp服务器使用的是什么io模型,我说的是socket I/O 模型!
一下是各种io模型的大概性能比较。
I/O 模型 尝试数/连接成功数
block: 7000/1008
noBlock: 7000/4011
WSAAsyncSelect: 7000/1956
WSAEventSelect: 7000/6999
Overlapped: 7000/5558
completion port: 7000/7000, 50000/4997
Top 14楼 netsys2 ( 来电!) 回复于 2003-12-09 12:12:42 得分 0
强烈关注。。。
Top 15楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-09 13:00:38 得分 10
更正:
completion port: 7000/7000, 50000/49997
Top 16楼 warton ( 知而后定 定而后动) 回复于 2003-12-09 13:16:46 得分 10
肯定是机器配置的问题了
另外操作系统也会有影响。
win2k adv也应该对连接有一个限制吧,以前在128M win2k pro版上测试过,几百个连接就不行了。
98好像只能支持100多个连接?用2000的数据中心试试:)
Top 17楼 warton ( 知而后定 定而后动) 回复于 2003-12-09 13:19:19 得分 10
512M的内存做为服务器来说是不是小了点?加内存应该就能提高连接数
要不做成集群,呵呵
Top 18楼 warton ( 知而后定 定而后动) 回复于 2003-12-09 13:29:53 得分 10
http://www.csdn.net/develop/article/22/22433.shtm
Top 19楼 pp616 ( 傻小子) 回复于 2003-12-09 14:18:50 得分 0
这帖子我看了。对我的问题没什么实际帮助啊。
Top 20楼 pp616 ( 傻小子) 回复于 2003-12-09 14:19:08 得分 0
老大们帮帮我啊。
Top 21楼 yesry ( 噎死你) 回复于 2003-12-09 15:47:23 得分 10
我试过了,对于一台P4 1.8G ,256内存的机器CreateIoCompletionPort只能是3963个Socket可以连接!
Top 22楼 warton ( 知而后定 定而后动) 回复于 2003-12-09 16:31:47 得分 10
相信是硬件和操作系统的问题了。不过,如果是软件的问题,那我还是希望能有好有方法可以提高连接数。
Top 23楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-09 17:17:23 得分 10
在你连接达到极限的时候看一下计算机的cpu使用率,内存使用,以及你的服务器所开启的线程。
如果你既然使用的完成端口模型,那从原理上来说,接受40000个连接没有问题(我做过测试)。如果你不能达到,情况有三:
1:计算机配置不够,主要是内存太小,建议512M以上。
2:cpu占有太高。
3:开启线程太多。
如果不是上面的问题,检查你的程序。
Top 24楼 pp616 ( 傻小子) 回复于 2003-12-09 18:16:31 得分 0
我用的2个服务线程
cpu使用率不到20%
计算机同时也没有跑别的程序。
Top 25楼 ccrun ( 老妖)(www.ccrun.com) 回复于 2003-12-09 18:38:16 得分 10
深表关注,友情up.
Top 26楼 yesry ( 噎死你) 回复于 2003-12-10 10:01:06 得分 10
我再一次试了,发现我错了,原来3963个Socket连接的限制是作为客户的Socket的缓冲区满,而不是作为服务器的Socket停止了。上次是因为我的客户端和服务器端在同一个机器上进行的,所以出现了缓冲区满的错误。
今天我用了3台客户端,各自连接了3996个Socket,也出现了缓冲区满的错误,但至少服务器可以接受11988个Socket连接。
Top 27楼 RomanticProgrammer ( ) 兰企鹅||南极俺最帅 () 回复于 2003-12-10 10:19:28 得分 10
我想楼主的错误和上面的兄弟一样,是把客户端和服务端放在了同一台计算机上。而使创建的socket数超过了3997个造成的吧。
Top 28楼 yesry ( 噎死你) 回复于 2003-12-10 10:22:41 得分 10
另外,我想说一下对Completion Port 发表一下看法
其实,没有接触这个之前,我就已经产生了“任务—线程”的分配机制进行了深入的研究,自己开始做这个分配器,后来发现,它和ATL的COM的情况是一样的,有限个线程服务不确定个客户请求。由于这个分配器性能强差人意(时间就消耗在事件与事件发生者的对应查找上和动态列表增删中),我放弃了。现在突然发现可以用Completion Port来实现,嘿嘿,性能还不错。
所以上面提到的连接数目,我个人认为,在服务的任务忙得过来的情况下(比如楼主所说的除了accept外什么也不做),是否用Completion Port不会影响连接的数目。
Top 29楼 copy_paste ( 木石三) 回复于 2003-12-10 10:45:50 得分 10
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1410183
这边有介绍,需要是从注册表去改,不过没试过,:D
Top 30楼 copy_paste ( 木石三) 回复于 2003-12-10 10:51:40 得分 0
企鹅那边做过最多连接是多少?
我以前写的时候只是试过两台机测试,每台机连了差不多2K(不到)连接,也就是差不多4K个连接总共,好像超过4K,再加上服务端也启动连接,忘了,N久前测试的。
IOCP应该不止4K的连接数限制。
Top 31楼 pp616 ( 傻小子) 回复于 2003-12-10 12:27:29 得分 0
问题搞定了。非常谢谢大家。
谢谢哥们们帮忙。
Top 32楼 warton ( 知而后定 定而后动) 回复于 2003-12-10 12:52:48 得分 0
?
Top
以上是关于一个TCP端口最多可以同时连接多少个客户端呢?的主要内容,如果未能解决你的问题,请参考以下文章
在一个 tcp 连接中,一个服务器怎么可能同时处理超过 65535 个客户端呢?
SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程selectpollepoll都是可以的)一个端口最大支持建立多少个tcp连接?