从命令行在随机分配的开放端口上运行tor



我需要从命令进程启动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 repo,但我正在尝试在不依赖库的情况下完成一些基本功能。

在做了一些进一步的研究后发现,它似乎取自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;
}

最新更新