从c#中的其他方法访问创建的对象

时间:2015-01-19 02:34:38

标签: c# ssh.net

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

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

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

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

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));

1 个答案:

答案 0 :(得分: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循环。这是我的Kill Connection按钮,例如:

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)开始,一直向上,直到达到注册的连接数量(实际存储的对象)。