gpt4 book ai didi

c# - 获取随机免费打开的端口进行测试

转载 作者:可可西里 更新时间:2023-11-01 13:33:25 26 4
gpt4 key购买 nike

我正在使用 REST API 服务运行一些集成测试。
问题是有时硬编码端口在下次测试开始时不是空闲的。因为是之前测试打开的,还没有被系统关闭。

我使用 OWIN,应用程序在下一次测试开始时关闭。

你能给我一个确定系统空闲端口的好方法吗提前打开然后关闭它?或者说不可能。

因为它可能还没有被系统释放,就像它已经发生一样。

最佳答案

作为 TempoClick 的 answer 的替代品, 我们可以使用 IPGlobalProperties.GetActiveTcpListeners()测试端口是否可用的方法 - 无需尝试提前打开它。 GetActiveTcpListeners() 返回系统上所有事件的 TCP 监听器,因此我们可以使用它来确定端口是否空闲。

public bool IsFree(int port)
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] listeners = properties.GetActiveTcpListeners();
int[] openPorts = listeners.Select(item => item.Port).ToArray<int>();
return openPorts.All(openPort => openPort != port);
}

请注意,GetActiveTcpListeners() 不会返回监听的 UDP 端点,但我们可以使用 GetActiveUdpListeners() 获取它们。

因此,您可以从默认端口开始(或选择一个随机值)并不断递增,直到您使用 IsFree 方法找到空闲端口。

int NextFreePort(int port = 0) 
{
port = (port > 0) ? port : new Random().Next(1, 65535);
while (!IsFree(port))
{
port += 1;
}
return port;
}

一个简单的测试:

using System;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Linq;

class Test
{
static void Main(string[] args)
{
int port = 1000;
Console.WriteLine(IsFree(port));
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
server.Start();
Console.WriteLine(IsFree(port));
Console.WriteLine(NextFreePort(port));
}

static bool IsFree(int port)
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] listeners = properties.GetActiveTcpListeners();
int[] openPorts = listeners.Select(item => item.Port).ToArray<int>();
return openPorts.All(openPort => openPort != port);
}

static int NextFreePort(int port = 0) {
port = (port > 0) ? port : new Random().Next(1, 65535);
while (!IsFree(port)) {
port += 1;
}
return port;
}
}

另一种方法是使用零端口。在这种情况下,系统将从动态端口范围中随机选择一个空闲端口。我们可以从 LocalEndpoint 属性中获取此端口号。

TcpListener server = new TcpListener(IPAddress.Loopback, 0);
server.Start();
int port = ((IPEndPoint)server.LocalEndpoint).Port;
Console.WriteLine(port);

关于c# - 获取随机免费打开的端口进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com