доступ к созданным объектам из других методов в c #

Я пишу программу туннелирования SSH на С # для объединения динамического туннелирования в единую программу, вместо того, чтобы использовать плагин putty + firefox socks4 / chrome socks4, вводя тот же user / pass..ect. Он использует библиотеку Renci.SSHNet.

Мой вопрос таков: когда я создаю новый объект SshClient, я хочу иметь возможность убить это соединение позже с помощью кнопки уничтожения соединения, а также иметь возможность запускать отдельный поток, который говорит while (isConnected) if (! AddedToList) addtolist .. Проблема в том, что я не уверен, как получить доступ к различным одновременно работающим объектам sshClient. Скажем, у меня есть 3 открытых подключения к разным хостам. Если я выберу IP-адрес хоста из текущих подключений, мне понадобится способ подключить этот IP-адрес к соединениям SshCLient, а затем запустить sshClient.Disconnect (). Я понимаю, что вы можете использовать sshClient.ConnectionInfo.Host.ToString () и сопоставить строку с этим, но опять же, если я использую другой метод (нажата кнопка отключения соединения), я не знаю, как сопоставить IP-адрес хоста 192.168.0. 1.1 к sshClient, который подключен к этому хосту.

Я изучил слабые ссылки, но, похоже, это работает только в том случае, если у меня был только один sshClient. Если бы существовал способ доступа к созданным в данный момент объектам SshClient, а затем сопоставьте его со свойством Host ip, это сработает. Я не могу найти это в гугле.

Я подумал о разработке какого-нибудь сложного способа создания переменной частного объекта SshClients, названной в честь deviceIpString, но не знал, как создать переменную, названную в честь содержимого другой переменной (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));

person Brandon    schedule 19.01.2015    source источник
comment
Добро пожаловать в Stack Overflow. SO работает так: ответы должны публиковаться как ответы. Не как редактирование вашего вопроса. Кроме того, способ, которым мы знаем, что ваш вопрос был рассмотрен (к вашему удовлетворению), заключается в том, чтобы вы принимали ответ (не редактируя заголовок и помещая там решено или ответ). Я бы порекомендовал вам посетить справочный центр или пройти тур, чтобы поближе познакомиться с SO.   -  person Damien_The_Unbeliever    schedule 20.01.2015
comment
Спасибо за помощь. Я внесу соответствующие изменения.   -  person Brandon    schedule 22.01.2015


Ответы (1)


Изменить: я исправил проблему с помощью изящного решения, которое я использовал в другой написанной мной программе. Я изменил название вопроса, потому что это можно применить к любому объекту любого типа, если вы можете создать из них массив. (не уверен в ситуации, в которой вы не можете, возможно, программа разрешает только один объект этого типа)

Решение: создайте частный массив для хранения всех объектов, на которые вы хотите ссылаться позже. Установите количество объектов, которые, по вашему мнению, могут быть созданы в программе. Затем создайте частную переменную типа int для индекса, начиная с 0. Создайте частный метод void (или открытый, если необходимо), который принимает объект в качестве аргумента. Результат должен выглядеть так:

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

Затем, когда вы дойдете до места, где вы создаете объект, при необходимости добавьте его в массив, используя метод register. Я делаю это после того, как проверю, что sshClient подключен. Затем наступает время, когда вам нужно что-то сделать с конкретным зарегистрированным вами объектом, найти какой-либо тип данных, который вы можете использовать для сопоставления с ним. Моя программа добавляет IP-адрес хоста в список после подключения sshClient. Я использую этот 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) и продолжается до тех пор, пока не достигнет количества зарегистрированных соединений (фактически сохраненных объектов).

person Brandon    schedule 21.01.2015