我正在研究服务器应用程序,我想打开很多端口。我可以打开的最大端口数是多少?谢谢!
编辑:我的意思是我可以打开多少个端口进行监听(作为服务器)
答案 0 :(得分:4)
大多数人没有向你解释除了tsells的一个评论之外,你很可能对tcp堆栈通常如何工作有一个无效的假设(这实际上是我在很久以前就已经混淆了)。
原因是当你有一个TcpListener(特定于DotNet但可能适用于大多数其他tcp库)时,当你开始监听并发生传入连接时,堆栈将监听你选择的端口(例如:端口:1234)但连接后会将连接移动到(通常)随机未分配端口。
例如,查看以下代码。
// Set the TcpListener on port 13000.
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
// TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while(true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
//Here you will find that if you look at the client LocalEndPoint a random dynamic port will be assigned.
}
这基本上意味着除非你有一个非常好的原因,否则你不应该真正关心这些实现细节,而且最大的开放端口基本上是无关紧要的(同样好运,试着写产生30000个线程并正确有效地维护这些连接的东西。
PS:当提供端口号时,我还验证了System.Net.Sockets.TcpListener内部,调用了以下代码,如果它未通过此测试,将抛出ArgumentOutOfRangeException。这证实了'Igby Largeman'所说的是16位无符号整数。
public static bool ValidateTcpPort(int port)
{
if (port >= 0)
{
return port <= 0xffff; //65535
}
return false;
}
答案 1 :(得分:0)
..取决于。我在W2K上有24000个连接,但它需要一些注册表调整。我确信Windows Server 2008将允许一些接近64K的最大值。