C# 服务器可以在不同端口上处理多少tcp连接?

C# 服务器可以在不同端口上处理多少tcp连接?,c#,sockets,network-programming,C#,Sockets,Network Programming,我正在用C#设计一个服务器客户端应用程序。 客户端通过tcp套接字与服务器进行连接和通信 在服务器端,我使用socket.accept()方法来处理来自客户端的新连接。客户端连接时,服务器使用随机端口与客户端通信 所以我的问题是。。服务器可以以这种形式接收多少个客户端? 有没有其他表格可以用来处理大量客户的问题?你可能会喜欢看到我以类似的方式提出的这个问题:,尤其是一些评论 答案似乎是没有实际的限制。接收端口和发送端口的组合必须是唯一的,并且每个端口都可以有64K值。组合的总数非常大。确实有很多

我正在用C#设计一个服务器客户端应用程序。 客户端通过tcp套接字与服务器进行连接和通信

在服务器端,我使用socket.accept()方法来处理来自客户端的新连接。客户端连接时,服务器使用随机端口与客户端通信

所以我的问题是。。服务器可以以这种形式接收多少个客户端?
有没有其他表格可以用来处理大量客户的问题?

你可能会喜欢看到我以类似的方式提出的这个问题:,尤其是一些评论

答案似乎是没有实际的限制。接收端口和发送端口的组合必须是唯一的,并且每个端口都可以有64K值。组合的总数非常大。确实有很多服务器都有大量的开放连接,但是要做到这一点,你必须解决许多其他有趣的问题。上面的问题包含一个链接,指向一篇关于一百万连接服务器的文章。另见。并对C10K问题进行网络搜索


您可能无法使用同步端口和线程,因为您遇到的是线程限制,而不是端口限制。您必须使用异步端口和线程池。你必须写一个扔掉,只是为了找出如何做到这一点。

这实际上受到操作系统的限制。你必须测试这个。在Windows上,必须在此规模下使用完全异步套接字IO。您可能会受到内存使用的限制

在TCP级别上,没有实际限制。
(服务器端口、服务器ip、客户端端口、客户端ip)的每个组合都可以有一个连接。
。因此,使用一个服务器端口和一个服务器ip,只要每个客户端的连接少于65k,就可以为无限数量的客户端提供服务

您不需要在服务器上选择随机端口。这是一种常见的误解

在服务器端,我使用socket.accept()方法来处理来自客户端的新连接。客户端连接时,服务器使用随机端口与客户端通信

除非您打开另一个从服务器到客户端的毫无意义的连接,否则不会这样做,因为防火墙的原因。接受的套接字使用与侦听套接字相同的本地端口号。与这里的几个答案和评论相反

因此,你的问题是基于一种误解。无论您用完了什么,它可能是内存、线程句柄、套接字句柄、套接字缓冲区空间、CPU、CPU电源、虚拟内存、磁盘空间等等,都不会是TCP端口

EDIT新随机端口理论的拥护者需要解释以下
netstat
输出:

TCP    127.0.0.4:8009         0.0.0.0:0              LISTENING
TCP    127.0.0.4:8009         127.0.0.1:53777        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53793        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53794        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53795        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53796        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53798        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53935        ESTABLISHED

并显示其中关于为接受的套接字分配新端口的内容,以及在TCP连接握手交换中新端口号的传输位置。

那么65k是我同时可以处理的最大值?你说的断开连接是什么意思?@oleksii这从头到尾都是完全错误的。请看我的答案。+1表示没有像其他人一样将公认的港口问题弄错,但规模如何?OP没有提到任何特定的规模。基本上,它将取决于内核可以分配多少内存来跟踪连接。@EJP你说得对。我假设他处于一个规模范围内,你必须考虑限制。当然,他可以使用同步端口,也就是说同步、阻塞套接字和线程。有数以百万计的TCP服务器正是这样做的。然而,肯定没有任何“拥有大量端口的服务器”或“百万端口服务器”。它们都有65535个TCP端口和65535个UDP端口。但是,有些服务器可以处理数百万个连接-1您将端口(其中有65535个)与套接字和连接(其中可能有相当多的可用端口)合并在一起。我不认为这样说甚至有点“挑剔”,而且我不认为一个编辑,纠正合并甚至轻微“次要”。64k和“百万”之间有很大的区别。看看端口和连接之间的混淆在这里和其他地方的其他答案中造成的问题。电气工程师在表示安培时不会说伏特,是吗?但物理学家通常在表示质量时会说重量。我用错了词,我改正了,我的答案现在更好了,那有什么问题?这就是SO应该如何工作的。好吧,但为什么在socket对象中它会显示本地端口:xxxx,这与socket的侦听端口不同。acceptRemoved my comments。谢谢您跟踪。@AviThalker如果您指的是已接受的套接字,它根本不会显示其他本地端口:您所描述的是不可能的。再看看。如果您指的是客户端套接字,当然它是一个不同的本地端口,但这不是您要问的问题。客户端的本地端口号与服务器的容量无关。