刚刚做socket通讯,最多同时连接200个左右的socket使用什么I/O模型最好!!!提供示例者加分!!!

时间:2021-05-28 20:52:20
刚刚做socket通讯,最多同时连接200个左右的socket使用什么I/O模型最好!!!提供示例者加分!!!

83 个解决方案

#1


完成端口

#2


最多200多用户,如果是我首先排除成端口,然后考虑是否要和用户发送大量的数据,如果是则使用重叠IO,如果不是则使用 select 或者 WSASelectEvent 之类的,因为这样可以降低开发的复杂度。

#3


在这里我发了一个重叠IO+完成例程的例子程序(写的比较简陋当时为了测试) 

http://221.8.31.55/bbs/read.php?tid=83 (需要先注册一个论坛的账号)

#4


可以考虑WSAAsynSelect或者WSAAsynEvent,如果对IOCP比较熟的话当然是iocp了

#5


同意ProgrameMan

才两百个连接,不应选择IOCP.

#6


完全没必要iocp,用select就完全可以,也好控制

#7


原来星星也问这种问题呀^-^

#8


事件选择模型就能满足了.

#9


才200啊,随便找一个
200个就上IOCP,真是大材小用

#10


呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!

现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!


不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。

#11


如果我来选择,我会选择Overlapped I/O

#12


呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!

答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:

操作系统:  xp  
处理器:  AMD3000+  
内存:  1GB  
硬盘:  80GB  
网络:  100MB  局域网
网络模型: 重叠IO

连接数量 = 51000


*******************************************************************************
现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!

答:这取决与网络数据的交互量,得根据交互量来计算。

****************************************************************************
不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。

答: 重叠IO要想做好同样涉及和多知识,线程池、内存池等等。


#13


答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:

操作系统:  xp  
处理器:  AMD3000+  
内存:  1GB  
硬盘:  80GB  
网络:  100MB  局域网
网络模型: 重叠IO

连接数量 = 51000
---------------------------------------------------------
我没看走眼吧,51000个连接,1GB内存? 你不会光连接然后什么都不做吧?
51000 ,算你每一个连接平均缓冲只用4KB,51000*4KB=?,SOCKET本身缓冲R+W是多少?
windows 32位系统能分配多少空闲物理内存资源给SOCKET? 不会超过50%吧,能上51000?
严重怀疑你这51000连接的意义,操作系统竟然还 XP,我不知道你是怎么测试的,
一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
开51000个连接,不管你什么模型,除非连了就断,否则
根本就是在扯淡

#14


同意楼上

#15


大规模服务器软件里,实际上
首先要保证的是连接的公平性
光快是没用的,这里,公平性》》效率

#16


to danscort2000(带鱼丝考) 

首先我的测试的确是光测试连接,服务器和客户端并没有进行数据的收发,因为我就是要测试服务器能够支持的最大连接数。

对于你所说的,我不想和你进行什么辩论,虽然你说我是在扯淡。

我想给你一个建议就是你搭建一个同样的测试环境看看是否可以达到这个数字,如果不可以那我就什么也不说了。还有希望你能在批评一个人之前先确认自己观点的正确性,关于我测试的数据是有一些证据的,你可以看一下之前我的帖子。

http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.8761255

无论对与错,感谢你多我的批评。




#17


to danscort2000(带鱼丝考) 

纠正你一点,按你所说的“算你每一个连接平均缓冲只用4KB,51000*4KB=?”

51000 * 4k = 204000K = 199.21875MB

难道1G的内存不够吗?

#18


to danscort2000(带鱼丝考) 

操作系统竟然还 XP,我不知道你是怎么测试的,
一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
开51000个连接,不管你什么模型,除非连了就断,否则
根本就是在扯淡


答: 我还真就是 xp 的(关于内存我上面说过了), 而且客户端连接上以后没有断开。另外告诉你我这个不是在扯淡。

#19


那我告诉你
我自己写了一整套服务器软件和配套软件,
使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的


上面确实是我计算错误,我算成2GB了,这个SORRY
我的4KB指的是每个连接的缓冲大小,按每个连接你只分配4KB
51000*4KB,200000KB,大约200M
那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?
XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接

我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。



#20


如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
握手是IP层是事情,我们根本还来不及也无法进行参与,
所以你做的测试==......

#21


那我告诉你
我自己写了一整套服务器软件和配套软件,
使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的

答: 带数据的测试我也做过,我也可以负责任的告诉你,最初我没有使用1G内存的时候(512MB)我达到了32300,而且个客户端连接以后都发送数据给服务器,服务器也去接收了,这也是经过我实际测试的,我不知道你是怎么做的居然达不到这个数量。

******************************************************************
XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接

答: 在本次恢复的最上面我已经回答了。

*********************************************************************************8
那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?

你说这话的时候经过成熟的思考吗? 1G可以达到 51000,按你所说去掉 400MB 还剩多少呢?如果2G内存呢(在64位机上内存可以更大)? 你说这没有意义我感觉很奇怪,在一些环境下是需要这种大量连接数的,比如客户端要连接到一个服务器并且大部分的时间是空闲的,因为他们是否要接收数据取决于服务器是否有他们的数据(简单的例子,服务器是广告服务器,也就是说当要有广告的时候服务器才发送给客户户端,当没有广告示保持空闲,这只是一个例子,当然可以不这么做,但怎么做取决于具体产品的构架)

******************************************************************************

我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。


答: 如果你真的不信我可以把我的测试代码发给大家,大家搭建环境测试一下,看看我是不是在扯淡,有要得请举手。 


最后我可以对我所说的每一句话负责。




#22


如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
握手是IP层是事情,我们根本还来不及也无法进行参与,

*************************************************************************
连接的速度和系统能够接受的连接数量是两个概念,当连接建立后是放到成功连接队列里的,等待队列中的元素应用层是无法发现的,只用党连接进入成功连接队列中,应用层的accept才会返回。

#23


真理越辩越明...

#24


其实你说说的这么大连接没有意义,从我自身来讲我是同意的,因为在我的

http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.423382 中我也说过,但是我为什么又说有意义了呢,是因为你非常不负责任的一个词 (“扯淡”),我非常气愤,我在回答任何一个人的问题时从来就没扯过淡,我知道的就知道,不知道的或者含糊的地方我都会加上 我认为或我个人认为,从来不会武断的阐述什么观点,这点大家可以看看我最近的回帖(我市最近2个月才总来CSDN的以前很少来),因此我会继续坚持我的观点 这么多连接数量是有意义的 呵呵

#25


你的结果数据从表面上看是对的,可以相信,
我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
和你原来采用的模型对比,速度有什么差距,连接数有什么差距
因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
已经告诉你了,
那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。


#26


实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别

答: 我也建议你去看看 unix 网络程序设计

#27




你的结果数据从表面上看是对的,可以相信,
我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
和你原来采用的模型对比,速度有什么差距,连接数有什么差距
因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
已经告诉你了,
那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。

******************************************

另外我说的连接成功不是在客户端统计的,使服务器的accept返回后才增加的计数器

#28


错是

答: 我也建议你去看看 unix 网络编程

#29


不过我还是希望你或者看这个帖子的各位动手测试下我的假连接不ACCEPT方法...

UNIX和TCP协议,我早就看过也写过里面的代码了,正是因为我所有32BIT的测试,所有的实现都无法达到你说的数字,
正因为这样,我才知道这里面的关键问题所在
一个32位进程能做出51000个TCP连接,我是非常非常非常佩服,
我老实的承认,在我所有的32位服务设计下,单进程我无论如何都做不到
所以很佩服很佩服


#30


如果你认为很快,那好,
我给你个最简单的对比,
使用阻塞SOCKET
开启一个线程
执行
while(1)
{
 s_new=accept(s_server,...);
 if(s_new==INVALID_SOCKET)
{
//error
}
 else
{
 ::InterlocketIncrement(&mi_total);
 //add something you want
}

}

和你的模型对下速度吧,谁快?差距多少?

#31


to danscort2000(带鱼丝考) 

刚刚我言辞有点过激还望海涵,主要是你说“扯淡”我比较气愤,现在平息了 呵呵,大家出发点都是好的,讨论技术嘛!

这样吧,你留下邮箱我把我的代码发给你,你测测看我是不是在扯淡好吗? 呵呵

#32


抱歉,我说话比较直接,也冲了点,SORRY

代码不用测试了,这个结果是可以相信的,因为你除了连接没有其他代码,我确信可以做到
用最基本阻塞SOCKET也能做到

sistest@tom.com

我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的

#33


to danscort2000(带鱼丝考)

我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们。

***************************************************************************
我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的

绝大部分的情况下的确不现实,但是说句实话,我正在公司新产品的构架中引进了这种机制,具体出于什么原因在这里就不方便说了 呵呵,代码我马上给你发过去

#34


to danscort2000(带鱼丝考)

代码我已经发过去了,请查收

另外更正一点

我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们(都成功的接收到了)。

#35


再问一句,
你发送完1024字节后,是断开连接,还是继续挂着?

你的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?

默认下 8+8KB * 32530=520480KB,也就是你的物理内存几乎全部被SOCKET吃光了,我觉得......

#36


你发送完1024字节后,是断开连接,还是继续挂着?

继续挂着

*********************************************

的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?

没有修改过,你看一下源代码就知道了

#37


高手讨论,收益多多啊。。。。。。。

#38


m

#39


学习

#40


up,alphahunters@hotmail.com

#41


to boyplayee() 

以经发给你了。

#42


这是一个服务器:
CPU: 至强2.6G X 4
Physical memory:4G
Other:......(不说了)
测试过服务器接受连接:>6W个,客户端随机选择500个socket发送一次(2K)再随机选择500个发送,而服务器接收到后返回数据,运行非常良好!

#43


学习

#44


up up
jove_wang@hotmail.com

#45


。。。。
转移个话题,我觉得难度不再是使用I/O,还是Overlapped,还是WSAEventSelect来实现,而在于对报文的处理逻辑。
至于模型就那么几种,框架例子也就那么1/200行代码,问题是以什么逻辑来处理收发和报文的应用层处理,以及输入输出的效率,才真正体现架构的合理和技巧性。
比如:各位处理每个连接的收发是不是放两个队列来循环投递的,也就是说每个连接最多占用两个收发的buffer。
又比如:收到一个完整的报文是放在独立的线程还是放在IO处理线程里面处理为好呢?
。。。。。
希望各位高手也能向上面那样讨论下,让俺们再张点知识!!

#46


我先抛砖吧,希望能引出好玉来:

我可能采用下面的处理方式:

对于每个连接来说,接收不使用队列,而是要保证每个连接始终有一个未返回的WSARecv(需要在协议的设计上保正客户端始终是以线性的方式发送请求),而对于发送来说是需要实现一个队列的。

另外对于报文的处理我认为可以把每个报文所对应的任务按执行的时间长短分成两类来处理,一类是可以在IO处理线程里直接处理的(时间很短就能完成的且不会阻塞的),另一类是在独立的线程中处理(例如访问数据库等消耗时间比较长的任务)

#47


ty_work@163.com
谢谢!研究一下

#48


各位老大:
线程池如何设计,不用WSAWait...函数他是有限制的,如何做到连接达到几万个。那得启动多少个线程???

#49


楼主是不是在拿我们消遣吧,那得启动多少个线程? 你不是说真的吧

#50


worker_1983@126.com 学习。劳烦了。

#1


完成端口

#2


最多200多用户,如果是我首先排除成端口,然后考虑是否要和用户发送大量的数据,如果是则使用重叠IO,如果不是则使用 select 或者 WSASelectEvent 之类的,因为这样可以降低开发的复杂度。

#3


在这里我发了一个重叠IO+完成例程的例子程序(写的比较简陋当时为了测试) 

http://221.8.31.55/bbs/read.php?tid=83 (需要先注册一个论坛的账号)

#4


可以考虑WSAAsynSelect或者WSAAsynEvent,如果对IOCP比较熟的话当然是iocp了

#5


同意ProgrameMan

才两百个连接,不应选择IOCP.

#6


完全没必要iocp,用select就完全可以,也好控制

#7


原来星星也问这种问题呀^-^

#8


事件选择模型就能满足了.

#9


才200啊,随便找一个
200个就上IOCP,真是大材小用

#10


呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!

现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!


不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。

#11


如果我来选择,我会选择Overlapped I/O

#12


呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!

答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:

操作系统:  xp  
处理器:  AMD3000+  
内存:  1GB  
硬盘:  80GB  
网络:  100MB  局域网
网络模型: 重叠IO

连接数量 = 51000


*******************************************************************************
现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!

答:这取决与网络数据的交互量,得根据交互量来计算。

****************************************************************************
不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。

答: 重叠IO要想做好同样涉及和多知识,线程池、内存池等等。


#13


答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:

操作系统:  xp  
处理器:  AMD3000+  
内存:  1GB  
硬盘:  80GB  
网络:  100MB  局域网
网络模型: 重叠IO

连接数量 = 51000
---------------------------------------------------------
我没看走眼吧,51000个连接,1GB内存? 你不会光连接然后什么都不做吧?
51000 ,算你每一个连接平均缓冲只用4KB,51000*4KB=?,SOCKET本身缓冲R+W是多少?
windows 32位系统能分配多少空闲物理内存资源给SOCKET? 不会超过50%吧,能上51000?
严重怀疑你这51000连接的意义,操作系统竟然还 XP,我不知道你是怎么测试的,
一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
开51000个连接,不管你什么模型,除非连了就断,否则
根本就是在扯淡

#14


同意楼上

#15


大规模服务器软件里,实际上
首先要保证的是连接的公平性
光快是没用的,这里,公平性》》效率

#16


to danscort2000(带鱼丝考) 

首先我的测试的确是光测试连接,服务器和客户端并没有进行数据的收发,因为我就是要测试服务器能够支持的最大连接数。

对于你所说的,我不想和你进行什么辩论,虽然你说我是在扯淡。

我想给你一个建议就是你搭建一个同样的测试环境看看是否可以达到这个数字,如果不可以那我就什么也不说了。还有希望你能在批评一个人之前先确认自己观点的正确性,关于我测试的数据是有一些证据的,你可以看一下之前我的帖子。

http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.8761255

无论对与错,感谢你多我的批评。




#17


to danscort2000(带鱼丝考) 

纠正你一点,按你所说的“算你每一个连接平均缓冲只用4KB,51000*4KB=?”

51000 * 4k = 204000K = 199.21875MB

难道1G的内存不够吗?

#18


to danscort2000(带鱼丝考) 

操作系统竟然还 XP,我不知道你是怎么测试的,
一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
开51000个连接,不管你什么模型,除非连了就断,否则
根本就是在扯淡


答: 我还真就是 xp 的(关于内存我上面说过了), 而且客户端连接上以后没有断开。另外告诉你我这个不是在扯淡。

#19


那我告诉你
我自己写了一整套服务器软件和配套软件,
使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的


上面确实是我计算错误,我算成2GB了,这个SORRY
我的4KB指的是每个连接的缓冲大小,按每个连接你只分配4KB
51000*4KB,200000KB,大约200M
那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?
XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接

我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。



#20


如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
握手是IP层是事情,我们根本还来不及也无法进行参与,
所以你做的测试==......

#21


那我告诉你
我自己写了一整套服务器软件和配套软件,
使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的

答: 带数据的测试我也做过,我也可以负责任的告诉你,最初我没有使用1G内存的时候(512MB)我达到了32300,而且个客户端连接以后都发送数据给服务器,服务器也去接收了,这也是经过我实际测试的,我不知道你是怎么做的居然达不到这个数量。

******************************************************************
XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接

答: 在本次恢复的最上面我已经回答了。

*********************************************************************************8
那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?

你说这话的时候经过成熟的思考吗? 1G可以达到 51000,按你所说去掉 400MB 还剩多少呢?如果2G内存呢(在64位机上内存可以更大)? 你说这没有意义我感觉很奇怪,在一些环境下是需要这种大量连接数的,比如客户端要连接到一个服务器并且大部分的时间是空闲的,因为他们是否要接收数据取决于服务器是否有他们的数据(简单的例子,服务器是广告服务器,也就是说当要有广告的时候服务器才发送给客户户端,当没有广告示保持空闲,这只是一个例子,当然可以不这么做,但怎么做取决于具体产品的构架)

******************************************************************************

我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。


答: 如果你真的不信我可以把我的测试代码发给大家,大家搭建环境测试一下,看看我是不是在扯淡,有要得请举手。 


最后我可以对我所说的每一句话负责。




#22


如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
握手是IP层是事情,我们根本还来不及也无法进行参与,

*************************************************************************
连接的速度和系统能够接受的连接数量是两个概念,当连接建立后是放到成功连接队列里的,等待队列中的元素应用层是无法发现的,只用党连接进入成功连接队列中,应用层的accept才会返回。

#23


真理越辩越明...

#24


其实你说说的这么大连接没有意义,从我自身来讲我是同意的,因为在我的

http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.423382 中我也说过,但是我为什么又说有意义了呢,是因为你非常不负责任的一个词 (“扯淡”),我非常气愤,我在回答任何一个人的问题时从来就没扯过淡,我知道的就知道,不知道的或者含糊的地方我都会加上 我认为或我个人认为,从来不会武断的阐述什么观点,这点大家可以看看我最近的回帖(我市最近2个月才总来CSDN的以前很少来),因此我会继续坚持我的观点 这么多连接数量是有意义的 呵呵

#25


你的结果数据从表面上看是对的,可以相信,
我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
和你原来采用的模型对比,速度有什么差距,连接数有什么差距
因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
已经告诉你了,
那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。


#26


实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别

答: 我也建议你去看看 unix 网络程序设计

#27




你的结果数据从表面上看是对的,可以相信,
我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
和你原来采用的模型对比,速度有什么差距,连接数有什么差距
因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
已经告诉你了,
那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。

******************************************

另外我说的连接成功不是在客户端统计的,使服务器的accept返回后才增加的计数器

#28


错是

答: 我也建议你去看看 unix 网络编程

#29


不过我还是希望你或者看这个帖子的各位动手测试下我的假连接不ACCEPT方法...

UNIX和TCP协议,我早就看过也写过里面的代码了,正是因为我所有32BIT的测试,所有的实现都无法达到你说的数字,
正因为这样,我才知道这里面的关键问题所在
一个32位进程能做出51000个TCP连接,我是非常非常非常佩服,
我老实的承认,在我所有的32位服务设计下,单进程我无论如何都做不到
所以很佩服很佩服


#30


如果你认为很快,那好,
我给你个最简单的对比,
使用阻塞SOCKET
开启一个线程
执行
while(1)
{
 s_new=accept(s_server,...);
 if(s_new==INVALID_SOCKET)
{
//error
}
 else
{
 ::InterlocketIncrement(&mi_total);
 //add something you want
}

}

和你的模型对下速度吧,谁快?差距多少?

#31


to danscort2000(带鱼丝考) 

刚刚我言辞有点过激还望海涵,主要是你说“扯淡”我比较气愤,现在平息了 呵呵,大家出发点都是好的,讨论技术嘛!

这样吧,你留下邮箱我把我的代码发给你,你测测看我是不是在扯淡好吗? 呵呵

#32


抱歉,我说话比较直接,也冲了点,SORRY

代码不用测试了,这个结果是可以相信的,因为你除了连接没有其他代码,我确信可以做到
用最基本阻塞SOCKET也能做到

sistest@tom.com

我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的

#33


to danscort2000(带鱼丝考)

我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们。

***************************************************************************
我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的

绝大部分的情况下的确不现实,但是说句实话,我正在公司新产品的构架中引进了这种机制,具体出于什么原因在这里就不方便说了 呵呵,代码我马上给你发过去

#34


to danscort2000(带鱼丝考)

代码我已经发过去了,请查收

另外更正一点

我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们(都成功的接收到了)。

#35


再问一句,
你发送完1024字节后,是断开连接,还是继续挂着?

你的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?

默认下 8+8KB * 32530=520480KB,也就是你的物理内存几乎全部被SOCKET吃光了,我觉得......

#36


你发送完1024字节后,是断开连接,还是继续挂着?

继续挂着

*********************************************

的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?

没有修改过,你看一下源代码就知道了

#37


高手讨论,收益多多啊。。。。。。。

#38


m

#39


学习

#40


up,alphahunters@hotmail.com

#41


to boyplayee() 

以经发给你了。

#42


这是一个服务器:
CPU: 至强2.6G X 4
Physical memory:4G
Other:......(不说了)
测试过服务器接受连接:>6W个,客户端随机选择500个socket发送一次(2K)再随机选择500个发送,而服务器接收到后返回数据,运行非常良好!

#43


学习

#44


up up
jove_wang@hotmail.com

#45


。。。。
转移个话题,我觉得难度不再是使用I/O,还是Overlapped,还是WSAEventSelect来实现,而在于对报文的处理逻辑。
至于模型就那么几种,框架例子也就那么1/200行代码,问题是以什么逻辑来处理收发和报文的应用层处理,以及输入输出的效率,才真正体现架构的合理和技巧性。
比如:各位处理每个连接的收发是不是放两个队列来循环投递的,也就是说每个连接最多占用两个收发的buffer。
又比如:收到一个完整的报文是放在独立的线程还是放在IO处理线程里面处理为好呢?
。。。。。
希望各位高手也能向上面那样讨论下,让俺们再张点知识!!

#46


我先抛砖吧,希望能引出好玉来:

我可能采用下面的处理方式:

对于每个连接来说,接收不使用队列,而是要保证每个连接始终有一个未返回的WSARecv(需要在协议的设计上保正客户端始终是以线性的方式发送请求),而对于发送来说是需要实现一个队列的。

另外对于报文的处理我认为可以把每个报文所对应的任务按执行的时间长短分成两类来处理,一类是可以在IO处理线程里直接处理的(时间很短就能完成的且不会阻塞的),另一类是在独立的线程中处理(例如访问数据库等消耗时间比较长的任务)

#47


ty_work@163.com
谢谢!研究一下

#48


各位老大:
线程池如何设计,不用WSAWait...函数他是有限制的,如何做到连接达到几万个。那得启动多少个线程???

#49


楼主是不是在拿我们消遣吧,那得启动多少个线程? 你不是说真的吧

#50


worker_1983@126.com 学习。劳烦了。