一个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 个客户端呢?

一台服务器​最大并发 tcp 连接数多少?65535?

负载均衡器可扩展性和最大 #tcp 端口

tcp服务器能支持多少个连接?

SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程selectpollepoll都是可以的)一个端口最大支持建立多少个tcp连接?

一台服务器​最大并发 tcp 连接数多少?65535?