В своем кросс-платформенном (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 туннелей?
Спасибо.
Здравствуйте,
http://vkontakteid.ru/id4820918, Вы писали:
DM>>Существует ли готовая SSH C++ библиотека, которая поддерживает асинхронный режим и позволяет одновременно создавать несколько SSH туннелей?
HVR>не знаю, но почему бы не клонировать процесс на каждый туннель и общаться с основным через IPC — общую память или иные механизмы
Спасибо за идею. У нас почти так и сделано сейчас. Дело в том, что SSH туннель создается в рамках SSH сессии. Таким образом, при текущей реализации libssh2 создавать отдельные процессы нет необходимости. Достаточно создавать отдельные сессии для каждого туннеля. Но...
Это приводит к тому, что на сервере запускается множество копий sshd (по одной на каждую сессию). При большом количестве клиентов это сильно перегружает сервер. Хотелось бы все делать в рамках одной SSH сессии.