0

我正在编写 ac# SSH 隧道程序以将动态隧道合并到一个程序中,而不是使用 putty+firefox socks4/chrome socks4 插件,输入相同的用户/密码..ect。它正在使用 Renci.SSHNet 库。

我的问题是:当我创建一个新的 SshClient 对象时,我希望能够稍后从终止连接按钮终止该连接,并且还能够运行一个单独的线程,该线程说 while(isConnected) if (! addedToList) addtolist ..问题是我不确定如何访问不同的同时运行的 sshClient 对象。假设我有 3 个与不同主机的开放连接。如果我从当前连接中选择主机 ip,我需要一种方法将该 ip 地址与 SshCLient 连接连接,然后运行 ​​sshClient.Disconnect()。我意识到您可以使用 sshClient.ConnectionInfo.Host.ToString() 并匹配一个字符串,但如果我使用不同的方法(单击终止连接按钮)我不知道如何匹配 192.168 的主机 ip。 1.1 到连接到该主机的 sshClient。

我研究了弱引用,但这似乎只有在我只有一个 sshClient 时才有效。如果有一种方法可以访问当前创建的 SshClient 对象,然后将其与 Host ip 属性匹配,它将起作用。我在 Google 中找不到这个。

我考虑过设计一些精心设计的方法来创建以 deviceIpString 命名的私有对象变量 SshClients,但不确定如何创建以另一个变量的内容(字符串)命名的变量。如:

deviceIpString = 192.168.1.1;
(i am pretending that backticks access the variable's data, since I dont know how to do it)
private SshClient 'deviceIpString' = new (SshClient(arguments));
4

1 回答 1

0

编辑:我用我在我写的另一个程序中使用的一个简洁的解决方案解决了这个问题。我更改了问题的名称,因为这可以应用于任何类型的任何对象,只要您可以将它们组成一个数组即可。(不确定你不能的情况,也许程序只允许该类型的一个对象)

解决方案:创建一个私有数组来存储您以后要引用的所有对象。将其设置为您认为可以在程序中创建的许多对象。然后,为索引创建一个私有 int 变量,从 0 开始。创建一个接受对象作为参数的私有 void(或公共,如果需要)方法。结果应如下所示:

private SshClient[] sshClients = new SshClient[10];
private int sshClientIndex = 0;
private void registerSshClient(SshClient sshClient)
{
  sshClients[sshClientIndex] = sshClient;
  ++sshClientIndex;
}

然后,当您创建对象时,在必要时使用 register 方法将其添加到数组中。我在验证 sshClient 已连接后执行此操作。然后,当您需要对已注册的特定对象执行某些操作时,请找到可用于匹配它的某种类型的数据。一旦 sshClient 连接,我的程序就会将主机 ip 添加到列表框中。我使用这个 IP 地址来匹配 sshClient 的连接信息属性。要匹配数组中的某个对象,请使用 for 循环。这是我的终止连接按钮的示例:

private void button_kill_connection_Click(object sender, EventArgs e)
    {
        Object selectedConnection = null;
        selectedConnection = lbox_current_connections.SelectedItem;
        String selectedConnectionString = selectedConnection.ToString();
        for (int i = 0; i <= --sshClientIndex; i++)
        {

            if (sshClients[i].ConnectionInfo.Host == selectedConnectionString)
            {
                sshClients[i].Disconnect();
                lbox_current_connections.Items.Remove(selectedConnection);
            }
        }
    }

for 循环从第一个数组元素 (0) 开始,一直向上直到达到注册的连接数(实际存储的对象)。

于 2015-01-21T23:37:33.320 回答