我正在用C#设计服务器客户端应用程序。 客户端连接并与服务器通信扔掉了tcp套接字。
在服务器端我使用socket.accept()方法来处理来自客户端的新连接。当客户端连接时,服务器使用随机端口与客户端通信。
所以我的问题是..服务器可以以这种形式接收多少客户端? 我应该使用另一种形式来处理大量客户吗?
答案 0 :(得分:3)
这实际上受操作系统的限制。你必须测试这个。在Windows上,您必须使用此规模的完全异步套接字IO。您可能会受到内存使用的限制。
在TCP级别上没有实际限制。 (server port, server ip, client port, client ip)
的每个组合可以有一个连接。因此,只需一个服务器端口和一个服务器ip,即使每个客户端的连接数少于65k,也可以为无限量的客户端提供服务。
您无需在服务器上选择随机端口。这是一种常见的误解。
答案 1 :(得分:1)
在服务器端我使用socket.accept()方法来处理来自客户端的新连接。当客户端连接时,服务器使用随机端口与客户端通信。
除非你打开从服务器到客户端的另一个无意义的连接,否则你不会因防火墙原因而这样做。接受的套接字使用与侦听套接字相同的本地端口号。与此处的几个答案和评论相反。
因此,您的问题建立在误解之上。无论你用完什么,它可能是内存,线程句柄,套接字句柄,套接字缓冲区空间,CPU,CPU电源,虚拟内存,磁盘空间......,它不会是TCP端口。
编辑新随机端口理论的支持者需要解释以下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
并显示RFC 793中有关将新端口分配给已接受套接字的内容,以及TCP连接握手交换中传送新端口号的位置。
答案 2 :(得分:-1)
您可能希望以类似的方式看到我提出的这个问题:https://softwareengineering.stackexchange.com/questions/234672/is-there-are-problem-holding-large-numbers-of-open-socket-connections-for-length,特别是一些评论。
答案似乎是没有实际限制。接收端口和发送端口的组合必须是唯一的,并且每个端口都可以具有64K值。组合总数非常大。确实存在具有极大数量的开放连接的服务器,但要实现这一目标,您必须解决许多其他有趣的问题。上面的问题包含一篇关于一百万个连接服务器的文章的链接。另见How to retain one million simultaneous TCP connections?。并在网上搜索C10K问题。
您可能无法做的是使用同步端口和线程,因为您遇到了线程限制,而不是端口限制。您必须使用异步端口和线程池。你必须写一个扔掉,只是为了找出如何去做。