首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在命令行随机分配的开放端口上运行tor

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

Stack Overflow用户
提问于 2021-12-28 06:43:02
回答 1查看 111关注 0票数 0

我需要从命令过程启动tor进程,并为所述进程随机分配一个开放端口。在做了一些研究之后,我了解到我可以使用端口0,系统将提供所需的功能。

我在Windows 10上执行以下命令:

代码语言:javascript
复制
tor --SocksPort 0 | more

虽然输出表示成功,但输出不告诉我进程运行在哪个端口上。在C#中以编程方式找到这些信息的最佳方法是什么?下面是我的TorProxy类,请参阅StartAsync()方法中的注释。

代码语言:javascript
复制
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回购,但我试图在不依赖库的情况下完成一些基本功能。

EN

回答 1

Stack Overflow用户

发布于 2021-12-28 09:37:35

在做了一些进一步的研究后发现,它似乎是从Selenium源代码中提取的。它在我的用例中运行得很好:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70503603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档