我需要从命令过程启动tor进程,并为所述进程随机分配一个开放端口。在做了一些研究之后,我了解到我可以使用端口0,系统将提供所需的功能。
我在Windows 10上执行以下命令:
tor --SocksPort 0 | more虽然输出表示成功,但输出不告诉我进程运行在哪个端口上。在C#中以编程方式找到这些信息的最佳方法是什么?下面是我的TorProxy类,请参阅StartAsync()方法中的注释。
public class TorProxy : Proxy, IAsyncDisposable
{
private Process process;
private string dataDir;
private int socks5Port;
private string torPath;
public TorProxy(int socks5Port, string torPath, string dataDir) : base(new Uri($"socks5://localhost:{socks5Port}"))
{
this.socks5Port = socks5Port;
this.torPath = torPath;
this.dataDir = dataDir;
}
public async Task StartAsync()
{
await Task.Run(() =>
{
var processStartInfo = new ProcessStartInfo()
{
FileName = torPath,
Arguments = $"--SocksPort {socks5Port} --DataDirectory {dataDir}"
};
process = Process.Start(processStartInfo);
//QUESTION: If socks5Port = 0, how do I find out what port was assigned to the process?
});
}
public async Task StopAsync()
{
await Task.Run(() =>
{
if (process != null)
{
process.Kill(true);
process.WaitForExit();
if (Directory.Exists(dataDir))
Directory.Delete(dataDir, true);
}
});
}
public async ValueTask DisposeAsync()
{
await StopAsync();
}
}附带注意:我知道TorSharp回购,但我试图在不依赖库的情况下完成一些基本功能。
发布于 2021-12-28 09:37:35
在做了一些进一步的研究后发现,它似乎是从Selenium源代码中提取的。它在我的用例中运行得很好:
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;
}https://stackoverflow.com/questions/70503603
复制相似问题