Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET/Windows服务器中的最大传出套接字连接数_C#_.net_Windows_Sockets_Windows Server 2003 - Fatal编程技术网

C# .NET/Windows服务器中的最大传出套接字连接数

C# .NET/Windows服务器中的最大传出套接字连接数,c#,.net,windows,sockets,windows-server-2003,C#,.net,Windows,Sockets,Windows Server 2003,我有一个稍微不寻常的情况,我需要为我的服务器上的数千名移动用户维护到另一台服务器的客户端tcp连接(基本上是移动设备在能够连接到我的中间层服务器时连接到另一台服务器,从而为移动设备维护到第三方服务器的更稳定连接) 无论如何,我已经使用异步套接字(封装在SslStream中)开发了我的服务器应用程序,现在已经有1000个客户端会话在它上面全职运行。我对结果非常满意,因为我看到单核处理器的平均cpu使用率约为0-10%,随着时间的推移,使用了大约60mb的ram 我的问题是,我如何扩展它,以便在我的

我有一个稍微不寻常的情况,我需要为我的服务器上的数千名移动用户维护到另一台服务器的客户端tcp连接(基本上是移动设备在能够连接到我的中间层服务器时连接到另一台服务器,从而为移动设备维护到第三方服务器的更稳定连接)

无论如何,我已经使用异步套接字(封装在SslStream中)开发了我的服务器应用程序,现在已经有1000个客户端会话在它上面全职运行。我对结果非常满意,因为我看到单核处理器的平均cpu使用率约为0-10%,随着时间的推移,使用了大约60mb的ram

我的问题是,我如何扩展它,以便在我的服务器上运行100000或200000或更多的客户端会话?同样,这有点不传统,因为我的服务器实际上不像服务器,因为我担心的是传出连接,而不是传入连接

我知道有一个注册表设置MaxUserPort需要更改,以超出默认值5000。然而,似乎还有一个65535的硬限制,我不太清楚这个限制在哪里。 这是每个网络接口的限制吗?这是一个全球窗口限制吗?每个过程是否有限制

如果是每个网络接口的限制,我是否可以添加多个网络接口并将客户端会话套接字绑定到每个接口(例如:接口1上的65k、接口2上的65k等)

我也不太确定我应该设置什么样的套接字选项或属性来帮助解决问题。现在我没有使用任何套接字选项


我非常感谢大家对这个问题的任何想法,因为在这个问题上很难得到明确的建议。谢谢

65355是IP协议的一个限制,更重要的是大多数操作系统的TCP/IP堆栈施加的限制

要增加窗口上的最大数量,请执行以下步骤:

  • 启动注册表编辑器
  • 在注册表中找到以下子项,然后单击“参数”: HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  • 在“编辑”菜单上,单击“新建”,然后添加以下注册表项:

    值名称:MaxUserPort

    值类型:DWORD

    价值数据:65534

    有效范围:5000-65534(十进制)

    默认值:0x1388(5000十进制)

    描述:此参数控制程序从系统请求任何可用用户端口时使用的最大端口号。通常,在1024和5000(包括1024和5000)之间分配短暂(短期)端口


  • 通常,要扩展到65K以上的端口,您需要在集群中使用多个服务器。

    Windows计算机可以轻松地扩展到非常多的开放连接。64k临时端口限制是每个IP地址,而不是每台机器。如果您需要更多临时端口,请按照@SuperTux的建议增加限制,但也要为机器分配更多IP。为了利用这个优势,您必须在客户端套接字上手动调用Bind(),并从池中传递一个带有空闲端口的源IP(这也意味着您将负责跟踪每个地址的可用临时端口计数)。许多高端设备类型的设备都这样做(例如,负载平衡器上的SNAT池)以支持数十万个并发连接


    簿记是一件麻烦事,但总比在每64k客户端连接中使用未充分利用的硬件要好。

    这是否意味着我可以创建一个端口为0的本地IPEndPoint,但它需要一个特定网络接口的IP地址,并且它将计算出要使用的空闲临时端口?对于120000个连接,我需要在服务器上安装2个IP,我负责将一半连接绑定到每个IP地址?我的想法是将进程分配给特定的IP地址,然后将客户端会话帐户分配给IP地址。所以,我想我是说如果我的假设是正确的,我不必担心哪个特定端口可以本地绑定到另一个端口,那么“簿记”也不会那么糟糕。所以,我的套接字有什么特别的事情要做吗?是否有任何特定的SetSocketOption()我应该使用,我是否需要担心UseOnlyOverlappedIO或ExclusivedDressUse属性?正确-IP堆栈将跟踪各个忙/闲端口。默认套接字选项应该可以正常工作,除非您计划在进程之间处理套接字。太好了,谢谢,我不打算在进程之间处理套接字或其他任何东西。这很简单,我将为每个帐户分配一个IP,并确保分配给IP的帐户不超过临时端口。