Tcp/ip 服务器最大连接数的问题。请invalid、songhtao、warton3为版主和各位哥们帮忙看看。

pp616 2003-12-08 05:54:11
最近服务器程序。用的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还是这样。
哎···没折了。大伙遇到过这问题吗。帮帮忙吧。
...全文
1857 点赞 收藏 32
写回复
32 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
warton 2003-12-10
回复
pp616 2003-12-10
问题搞定了。非常谢谢大家。
谢谢哥们们帮忙。
回复
copy_paste 2003-12-10
企鹅那边做过最多连接是多少?
我以前写的时候只是试过两台机测试,每台机连了差不多2K(不到)连接,也就是差不多4K个连接总共,好像超过4K,再加上服务端也启动连接,忘了,N久前测试的。
IOCP应该不止4K的连接数限制。
回复
copy_paste 2003-12-10
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1410183

这边有介绍,需要是从注册表去改,不过没试过,:D
回复
yesry 2003-12-10
另外,我想说一下对Completion Port 发表一下看法
其实,没有接触这个之前,我就已经产生了“任务—线程”的分配机制进行了深入的研究,自己开始做这个分配器,后来发现,它和ATL的COM的情况是一样的,有限个线程服务不确定个客户请求。由于这个分配器性能强差人意(时间就消耗在事件与事件发生者的对应查找上和动态列表增删中),我放弃了。现在突然发现可以用Completion Port来实现,嘿嘿,性能还不错。

所以上面提到的连接数目,我个人认为,在服务的任务忙得过来的情况下(比如楼主所说的除了accept外什么也不做),是否用Completion Port不会影响连接的数目。
回复
我想楼主的错误和上面的兄弟一样,是把客户端和服务端放在了同一台计算机上。而使创建的socket数超过了3997个造成的吧。
回复
yesry 2003-12-10
我再一次试了,发现我错了,原来3963个Socket连接的限制是作为客户的Socket的缓冲区满,而不是作为服务器的Socket停止了。上次是因为我的客户端和服务器端在同一个机器上进行的,所以出现了缓冲区满的错误。
今天我用了3台客户端,各自连接了3996个Socket,也出现了缓冲区满的错误,但至少服务器可以接受11988个Socket连接。
回复
netsys2 2003-12-09
强烈关注。。。
回复
请说明您的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
回复
ThinkX 2003-12-09
IOCP是windows下大并发服务器的唯一选择。
按照你的说法,可能是配置的问题吧,不知道这个和硬件配置是否有关系,也许硬件不够强大。
回复
yesry 2003-12-09
gz
回复
ccrun.com 2003-12-09
深表关注,友情up.
回复
pp616 2003-12-09
我用的2个服务线程
cpu使用率不到20%
计算机同时也没有跑别的程序。
回复
在你连接达到极限的时候看一下计算机的cpu使用率,内存使用,以及你的服务器所开启的线程。
如果你既然使用的完成端口模型,那从原理上来说,接受40000个连接没有问题(我做过测试)。如果你不能达到,情况有三:
1:计算机配置不够,主要是内存太小,建议512M以上。
2:cpu占有太高。
3:开启线程太多。

如果不是上面的问题,检查你的程序。
回复
warton 2003-12-09
相信是硬件和操作系统的问题了。不过,如果是软件的问题,那我还是希望能有好有方法可以提高连接数。
回复
yesry 2003-12-09
我试过了,对于一台P4 1.8G ,256内存的机器CreateIoCompletionPort只能是3963个Socket可以连接!
回复
pp616 2003-12-09
老大们帮帮我啊。
回复
pp616 2003-12-09
这帖子我看了。对我的问题没什么实际帮助啊。
回复
warton 2003-12-09
http://www.csdn.net/develop/article/22/22433.shtm
回复
warton 2003-12-09
512M的内存做为服务器来说是不是小了点?加内存应该就能提高连接数

要不做成集群,呵呵
回复
发帖
网络及通讯开发
创建于2007-08-02

1299

社区成员

C++ Builder 网络及通讯开发
申请成为版主
帖子事件
创建了帖子
2003-12-08 05:54
社区公告
暂无公告