Поиск асинхронной C++ SSH библиотеки
От: Denis Malyshkin Россия  
Дата: 27.03.12 10:49
Оценка:
В своем кросс-платформенном (Win/Mac/Linux) C++ для создания SSH туннелей мы используем библиотеку libssh2. Она используется в асинхронном режиме (т.е. вся обработка нескольких SSH туннелей происходит в одном потоке при помощи callback-ов).

Все работает замечательно, за исключением одного нюанса. Данная библиотека не позволяет одновременно создавать несколько туннелей. Т.е. использовать несколько туннелей можно одновременно, но вот операция создания -- допустима только одна в каждый момент времени (http://www.libssh2.org/mail/libssh2-devel-archive-2012-02/0002.shtml).
Таким образом, на приходится сериализовать операцию создания туннеля. Сделано это при помощи очереди. К сожалению, очередь существенно снижает быстродействие. Перепробовали несколько типов очередей, но эффекта это не дало.

Таки образом, нам видятся несколько вариантов решения проблемы:
1. Доработать libssh2 библиотеку и реализовать в ней параллельное создание туннелей.
2. Найти другую библиотеку.

Первый способ кажется излишне трудоемким...
Но и второй способ не очень прост. Поиск в интернете дал следующие результаты:
1. libSSH Работает только в синхронном режиме.
2. FlowSSH Только под Win.
3. OpenSSH Set of utilities. Это вообще набор утилит. Библиотека или API документация не обнаружены. Такое ощущение, что библиотеки тут нет совсем -- http://www.gossamer-threads.com/lists/openssh/dev/37008
4. Chilkat SSH / SFTP C/C++ Library Работает только в синхронном режиме.
5. NetSieben Secure Shell C++ Library Тоже работает только в синхронном режиме.

Существует ли готовая SSH C++ библиотека, которая поддерживает асинхронный режим и позволяет одновременно создавать несколько SSH туннелей?

Спасибо.
Re: Поиск асинхронной C++ SSH библиотеки
От: Аноним  
Дата: 31.03.12 06:04
Оценка:
Здравствуйте, Denis Malyshkin, Вы писали:

DM>Существует ли готовая SSH C++ библиотека, которая поддерживает асинхронный режим и позволяет одновременно создавать несколько SSH туннелей?

не знаю, но почему бы не клонировать процесс на каждый туннель и общаться с основным через IPC — общую память или иные механизмы
Re: Поиск асинхронной C++ SSH библиотеки
От: Мишень-сан  
Дата: 02.04.12 09:53
Оценка:
Здравствуйте, Denis Malyshkin, Вы писали:

Не совсем понятна связь:

DM>В своем кросс-платформенном (Win/Mac/Linux) C++ для создания SSH туннелей мы используем библиотеку libssh2. Она используется в асинхронном режиме (т.е. вся обработка нескольких SSH туннелей происходит в одном потоке при помощи callback-ов).


и:

DM>Все работает замечательно, за исключением одного нюанса. Данная библиотека не позволяет одновременно создавать несколько туннелей. Т.е. использовать несколько туннелей можно одновременно, но вот операция создания -- допустима только одна в каждый момент времени


Вы хотите использовать libssh2 в многопоточке?
Если нет, то у Вас и так будет не более 1 операции создания туннеля в момент времени.
Re[2]: Поиск асинхронной C++ SSH библиотеки
От: Аноним  
Дата: 02.04.12 13:05
Оценка:
Здравствуйте, http://vkontakteid.ru/id4820918, Вы писали:

DM>>Существует ли готовая SSH C++ библиотека, которая поддерживает асинхронный режим и позволяет одновременно создавать несколько SSH туннелей?

HVR>не знаю, но почему бы не клонировать процесс на каждый туннель и общаться с основным через IPC — общую память или иные механизмы

Спасибо за идею. У нас почти так и сделано сейчас. Дело в том, что SSH туннель создается в рамках SSH сессии. Таким образом, при текущей реализации libssh2 создавать отдельные процессы нет необходимости. Достаточно создавать отдельные сессии для каждого туннеля. Но...

Это приводит к тому, что на сервере запускается множество копий sshd (по одной на каждую сессию). При большом количестве клиентов это сильно перегружает сервер. Хотелось бы все делать в рамках одной SSH сессии.
Re[2]: Поиск асинхронной C++ SSH библиотеки
От: Аноним  
Дата: 02.04.12 13:11
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Не совсем понятна связь:

DM>>В своем кросс-платформенном (Win/Mac/Linux) C++ для создания SSH туннелей мы используем библиотеку libssh2. Она используется в асинхронном режиме (т.е. вся обработка нескольких SSH туннелей происходит в одном потоке при помощи callback-ов).
МС>и:
DM>>Все работает замечательно, за исключением одного нюанса. Данная библиотека не позволяет одновременно создавать несколько туннелей. Т.е. использовать несколько туннелей можно одновременно, но вот операция создания -- допустима только одна в каждый момент времени

МС>Вы хотите использовать libssh2 в многопоточке?

МС>Если нет, то у Вас и так будет не более 1 операции создания туннеля в момент времени.

Все реализуется в одном потоке.
Асинхронный режим -- это запрос на выполнение операции (который возвращает управление почти мгновенно, не ожидая завершения операции), а результат возвращается через callback. Никто не мешает в рамках одного потока запустить N операций параллельно.

Асинхронные параллельные операции чтения и записи в уже созданные N туннелей libssh2 поддерживает, а вот операция собственно создания -- увы, только одна в каждый момент времени.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.