79

動的に割り当てられた新しいオープン TCP ポートを使用して、WCF サービス呼び出し用の新しい net.tcp://localhost:x/Service エンドポイントを作成したいと考えています。

特定のサーバーへの接続を開くと、TcpClient が新しいクライアント側ポートを割り当てることを知っています。

.NET で次に開いている TCP ポートを見つける簡単な方法はありますか?

上記の文字列を作成できるように、実際の番号が必要です。その文字列を別のプロセスに渡す必要があるため、0 は機能しません。これにより、その新しいチャネルでコールバックできます。

4

8 に答える 8

144

これが私が探していたものです:

static int FreeTcpPort()
{
  TcpListener l = new TcpListener(IPAddress.Loopback, 0);
  l.Start();
  int port = ((IPEndPoint)l.LocalEndpoint).Port;
  l.Stop();
  return port;
}
于 2008-09-29T22:15:52.567 に答える
30

ポート番号 0 を使用します。TCP スタックは、次の空きポートを割り当てます。

于 2008-09-26T06:35:18.213 に答える
12

Selenium.WebDriver DLLから次のコードを見つけました

名前空間: OpenQA.Selenium.Internal

クラス: PortUtility

public static int FindFreePort()
{
    int port = 0;
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    try
    {
        IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
        socket.Bind(localEP);
        localEP = (IPEndPoint)socket.LocalEndPoint;
        port = localEP.Port;
    }
    finally
    {
        socket.Close();
    }
    return port;
}
于 2019-11-18T23:37:54.797 に答える
9

最初にポートを開き、次に他のプロセスに正しいポート番号を割り当てます。

それ以外の場合は、他のプロセスが最初にポートを開いても、別のポートを使用している可能性があります。

于 2008-09-26T08:00:45.687 に答える
3

指定された範囲内で次に使用可能な TCP ポートを見つけたい場合、これを実装するためのより簡略化された方法を次に示します。

private int GetNextUnusedPort(int min, int max)
{
    if (max < min)
        throw new ArgumentException("Max cannot be less than min.");

    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();

    var usedPorts =
        ipProperties.GetActiveTcpConnections()
            .Where(connection => connection.State != TcpState.Closed)
            .Select(connection => connection.LocalEndPoint)
            .Concat(ipProperties.GetActiveTcpListeners())
            .Concat(ipProperties.GetActiveUdpListeners())
            .Select(endpoint => endpoint.Port)
            .ToArray();

    var firstUnused =
        Enumerable.Range(min, max - min)
            .Where(port => !usedPorts.Contains(port))
            .Select(port => new int?(port))
            .FirstOrDefault();

    if (!firstUnused.HasValue)
        throw new Exception($"All local TCP ports between {min} and {max} are currently in use.");

    return firstUnused.Value;
}
于 2019-10-23T16:00:41.783 に答える