比如一台游戏服务器,同时可能会有上万人在游戏。如果建立了socket长连接的话,一台机子可以保存多少个socket连接呢?请高手解答下,谢谢!

解决方案 »

  1.   

    不是高手,抄书如下:套接字模式:      非阻塞当然多一些
    套接字I/O模型    重叠I/O 和完成端口当然多一些
    机器配置         配置高当然多一些
    是否支持多CPU   CPU多当然多一些以上成立的大前提是代码写的要合理而有效
      

  2.   

    TCP的话,跑几千用户就不错了。
      

  3.   

    另外与你带宽也有关系,一个用户流量以10K左右计算 10K*1000 = 10MB == 100Mb 
      

  4.   

    长连接20万吧。微软MSDN中说的最大数字!
    作为服务器不需要占用端口,对于带宽来说也不是问题,因为流量几乎不会用完。
    最重要的是内存,因为每个tcp连接至少要消耗内核内存(不分页内存)17K。
    不过这个数字没意义。首先你得保证你的程序能支持。能支持1万人在线的程序员,已经很难找了。
      

  5.   

    第一个需要考虑的因素:
       
        在Windows系统中,一个线程最多可以支持64个Socket。参考原文:
    Under Windows, there exists a default limit of 64 sockets used by a single signaling thread, so each signaling thread is able to handle at most 32 calls (with H.245 tunneling enabled). 链接:http://www.gnugk.org/gnugk-manual-5.html#ss5.2
    第二个要考虑的因素:带宽限制,参考前面的带宽计算方法。如果你要采用动态带宽控制,那么网上也有很多动态控制的算法,这个需要根据你自身的业务来设计。
      

  6.   

    不知道他们是怎么做的。不过,跟带宽关系也很最大吧。系统占用了那么多的资源。socket连接都不够时间片轮转的时间。
      

  7.   

    Mark 一下,同时向大家学习
      

  8.   

    第一个需要考虑的因素: 
      
        在Windows系统中,一个线程最多可以支持64个Socket。------------------------------------使用IOCP。应该不受到限制。处理2000个连接也就4个线程。
    第二个要考虑的因素:带宽限制---------------------------------我觉得大家计算带宽的方式很奇怪。
    楼上一个人说:
    另外与你带宽也有关系,一个用户流量以10K左右计算 10K*1000 = 10MB == 100Mb 
    我觉得这纯属伪科学。伪科学。伪科学。伪科学。伪科学。伪科学。伪科学。伪科学。伪科学。伪科学。首先一个用户的流量10K?每秒?除非流媒体,否则不可能达到这么大数字!其次。用户是轮训的,也就是说,在socket发送的时候,底层已经是线性处理了。如果send失败,那么你必须要等一段时间继续send。但这个时间往往是100ms以下。就跟CPU处理工作一样。如果我这一秒处理不了,下一秒处理即可,最多也就是失去了及时性,或者说响应时间。
    但是总的来说,(除了流媒体这种服务器)如果能把流量用完,真的是很不容易。
      

  9.   

    连接分为连入和连出,一般作为服务器以连入为主(当然也有连出的,暂不考虑)。不管是连入还是连出,系统为每一个有效socket描述符都会分配一定的资源,包括句柄等,当连接建立之后,系统会为每一个连接分配并维护一个上下文资源,其中包括未分页内存存储空间。对于Win32系统来说,未分页内存是有限的,并且不随物理内存的增加而增加,从而使得整个系统的相关资源变得非常有限,目前测试过的也就50~60K连接,要支持100k需要做相当多的优化工作。而对于连出则受socket端口号的限制,当然,如果是连接不同的服务器或者端口倒也可以通过端口重用来解决。
      

  10.   

    第一个需要考虑的因素:
     
        在Windows系统中,一个线程最多可以支持64个Socket。 不知道这句话是从哪里看到的阿?
    很好奇。
    一个连接可以对应一个SOCKET.所以发送连接可以有65535理论上。当接收请求时,可以用端口复用技术,
    那么这个端口复用可以支持多少,我也不知道了!
      

  11.   

    对于64个的支持,是由于select的默认只支持64个,Waitfor只支持64个连接跟socket对应,但是socket是4字节,不只有65535,但是端口只有65535,所以连入都建立在同一监听端口当中,也就是说多个连接可以共用同一个端口,同样通过端口复用,连出也同样允许共用同一端口。
      

  12.   

    什么叫P2P?是想说的UDP吧?楼主明确的是“连接”.
      

  13.   

    前端时间我使用socket通信,不停开socket,但不关闭,我当时一共开了7000多个Socket,最后实在连接不上了,到达了极限!
    但是我在另外一台机器上只能开3000多个socket,同一个服务器程序,我估计和网卡有很大关系!