Я использую код клиента для прямой и обратной переадресации портов из официальных обучающих программ: http://api.libssh.org/master/libssh_tutor_forwarding.html
Этот код отлично работает при подключении клиента к серверу OpenSSH на Ubuntu 16.10, т.е. достигается прямая и обратная пересылка портов.
Однако рассмотрите код клиента для переадресации обратного порта (web_server()
), который использует следующие вызовы:
ssh_channel_listen_forward()
ssh_channel_accept_forward()
Используя мой собственный сервер libssh, проблема заключается в том, что клиент выполняет вызов в ssh_channel_accept_forward()
со следующим сообщением об ошибке:
"No channel request of this type from server"
То есть сообщение об ошибке выводится следующим клиентским кодом после ожидания 1 минута:
channel = ssh_channel_accept_forward(session, 60000, &port);
if (channel == NULL)
{
fprintf(stderr, "Error waiting for incoming connection: %s\n",
ssh_get_error(session));
return SSH_ERROR;
}
Как мне создать запрос канала на стороне сервера, так что клиент не отправляется в ssh_channel_forward_accept()
и создается новый прямой канал? Я пробовал большинство функций API без удачи...
Существует ли конкретная функция API для отправки такого запроса канала? Если нет, как мне выполнить задачу запроса канала?
Мой код на стороне сервера идет по следующим строкам, где запрос ssh_channel_listen_forward()
захватывается следующей функцией обратного вызова:
void global_request(ssh_session session, ssh_message message, void *userdata) {
#ifdef DEBUG
printf("[Debug] global_request()\n");
#endif
struct session_data_struct *session_data = (struct session_data_struct*) userdata;
ssh_message_global_request_reply_success(message, 8080);
const char *addr = ssh_message_global_request_address(message);
int port = ssh_message_global_request_port(message);
printf("Received global request: %s:%d\n", addr, port);
session_data->channel = ssh_channel_new(session);
ssh_channel ch = ssh_message_channel_request_channel(message);
if (ssh_channel_is_open(session_data->channel)) {
printf("Channel is open!\n");
}
}
Однако, как указано, сервер не заставляет клиента принимать новый прямой канал при вызове ssh_channel_accept_forward()
.
Любые идеи?