我做的多线程SOCKET程序(搜索不同主机),比如:同时联192.168.1.1-255.255中的所有主机的21端口,发现:在98下只能开30个联接(线程),多了的话,就会联不上,而在2000下就没有限制,而XP或2003下也和98一样(好一点)。不知是系统问题,还是有什么开关我没打开。我用了select做超时联接(没用的话,同时联接数可以加高),望高手指点!
win2k下好像有几千个呢,98好像也不止30个吧,记不清楚了,我觉得应该是你的代码的问题
而且不需要那么多啊,可以每次10个,处理完再处理下10个啊
连这么系统资源也会不够啊
我觉得不会是因为系统的原因。
想想嘛,QQ服务器上有好多的tcp连接,每一个tcp连接都是一个线程哦。
你connect()别人,应该没有数量限制,我现在同时开100个线程都没问题;至于接收方则会受到listen(socket,backlog)中backlog大小的限制,如果它小了,接受方能同时建立的连接就小了,如果是这种情况,你的主动connect方会返回错误10061,connect refused.检查你的返回值!
为什么不用完成端口和线程池,开那么多线程干嘛.
应该没有限制,是你的程序问题,我通常服务器同时都可以让100客户端连接
不过你是客户端,也没有必要一下子开那么多,就象楼上说的比如开10个轮流,这样是合理的
,开太多,很耗资源。。。。。。。。。
listen(socket,backlog)中backlog大小的限制,如果它小了接受方能同时建立的连接就小了
======================================================
这个地方的backlog是在等待队列中的大小,而不是连接队列的大小。
就是说假如同时有10个在等待未处理的。而不是同时连接的线程。
QQ文件传输是通过服务器吗?
我感觉是直连的。
原因:一、对方隐身我就不能进行传输。
二、有时在网关后面就不行。
假如是TCP的话就不太可能存在这种情况了。
追求速度线程越多越好???
不是这样的。
你要CPU越多才越快呢。
我知道你是一个扫描程序吧。
非堵塞套接字可能会好点吧。
用非堵塞套接字可以立即返回,你可以以后再用select看看有多少连接了。
那样都可以不用多线程了只要一个工作线程就可以了。
反正你只是扫描而已吧?
select下面的读套接字:
writefds:
If processing a connect call (nonblocking), connection has succeeded.
Data can be sent.
可能会对你有用吧。
如果你真的需要处理大量(上千个)的SOCKET并且对每个SOCKET都需做大量的处理,那么建议你用完成端口模型来管理这些SOCKET,比较好效率也比较高;如果像上面说的只是做扫描而已那么最好采用楼上的建议。
qq应该是隔一会连接一下服务器,并不是始终连在服务器端的,发送接收消息是点对点方式
要不然服务器怎么受得了
我也觉得你的程序应该分批来连接,一下子连接太多系统资源更不上,可以采取分时操作啊
qq是用UDP协议,无连接的。。。。
QQ用tcp吗,最近出的一本网络游戏编程的书上说QQ是用无连接发送的,应该是UDP吧,不知道,那位大大可以告知一二
连接数 和操作系统关系密切,另外影响连接数的一个重要因素是内存,因为每个会话都要用到大约10kb左右的内存,你说的在2000下比98下连接的多是因为2000的内存管理比98好的多
你可以试一下在2000下用2GB内存,呵呵大约可以支持40000个连接 而98下只能到10000左右 ,具体数字记不住了 呵呵