The*_*ker 62 .net c# wcf networking tcp
我想为WCF服务调用创建一个新的net.tcp:// localhost:x/Service端点,并使用动态分配的新的open tcp端口.
我知道当我打开与给定服务器的连接时,TcpClient将分配一个新的客户端端口.
有没有一种简单的方法可以在.Net中找到下一个打开的TCP端口?
我需要实际的数字,以便我可以构建上面的字符串,0不起作用,因为我需要将该字符串传递给另一个进程,以便我可以回调该新的通道.
The*_*ker 119
这是我在寻找的东西:
static int FreeTcpPort()
{
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint)l.LocalEndpoint).Port;
l.Stop();
return port;
}
Run Code Online (Sandbox Code Playgroud)
Fat*_*TAN 11
我从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;
}
Run Code Online (Sandbox Code Playgroud)
首先打开端口,然后将正确的端口号提供给另一个进程.
否则,某些其他进程仍然可能首先打开端口,但您仍然有另一个进程.
该解决方案可与TheSeeker的公认答案相媲美。虽然我认为它更具可读性:
using System;
using System.Net;
using System.Net.Sockets;
private static readonly IPEndPoint DefaultLoopbackEndpoint = new IPEndPoint(IPAddress.Loopback, port: 0);
public static int GetAvailablePort()
{
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Bind(DefaultLoopbackEndpoint);
return ((IPEndPoint)socket.LocalEndPoint).Port;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只想提供一个起始端口,并让它返回下一个可用的TCP端口,请使用如下代码:
public static int GetAvailablePort(int startingPort)
{
var portArray = new List<int>();
var properties = IPGlobalProperties.GetIPGlobalProperties();
// Ignore active connections
var connections = properties.GetActiveTcpConnections();
portArray.AddRange(from n in connections
where n.LocalEndPoint.Port >= startingPort
select n.LocalEndPoint.Port);
// Ignore active tcp listners
var endPoints = properties.GetActiveTcpListeners();
portArray.AddRange(from n in endPoints
where n.Port >= startingPort
select n.Port);
// Ignore active UDP listeners
endPoints = properties.GetActiveUdpListeners();
portArray.AddRange(from n in endPoints
where n.Port >= startingPort
select n.Port);
portArray.Sort();
for (var i = startingPort; i < UInt16.MaxValue; i++)
if (!portArray.Contains(i))
return i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31943 次 |
| 最近记录: |