C - libssh и sftp - клиент / сервер - создание зависаний сеанса sftp - PullRequest
0 голосов
/ 29 июня 2019

Я реализовал связь клиент / сервер по SSH с libssh. Я также хочу осуществить загрузку файлов с клиента на сервер сейчас и следую за doc для него.

Однако при звонке зависает sftp = sftp_new(session);. Должен ли я явно открыть еще один ssh_channel для него на стороне сервера? Я только добавил код sftp на клиенте.

1 Ответ

1 голос
/ 29 июня 2019

Для всех, кто тоже борется, я наконец нашел решение.

Я нашел в теме этот вопрос , что libssh/sftp.h имеет отдельные функции для сервера в самом конце. Чтобы включить их, вы должны использовать #define WITH_SERVER.

Несмотря на комментарий к документу о том, что вам не нужно обрабатывать каналы самостоятельно, вам необходимо открыть новый канал на стороне сервера для связи SFTP. Реализация этого работала для меня:

while ((msg = ssh_message_get(session)))
{

    if (ssh_message_type(msg) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(msg) == SSH_CHANNEL_SESSION)
    {
        printf("[+] Got channel open request, opening new channel for sftp\n");
        sftpChannel = ssh_message_channel_request_open_reply_accept(msg);
        ssh_message_free(msg);
    }

    if (ssh_message_type(msg) == SSH_REQUEST_CHANNEL && ssh_message_subtype(msg) == SSH_CHANNEL_REQUEST_SUBSYSTEM)
    {
        if (!strcmp(ssh_message_channel_request_subsystem(msg), "sftp"))
        {
            ssh_message_channel_request_reply_success(msg);
            ssh_message_free(msg);

            // setup SFTP session
            sftp_session sftp = sftp_server_new(session, sftpChannel);
            if (sftp == NULL)
            {
                fprintf(stderr, "Error allocating SFTP session: %s\n", ssh_get_error(session));
            }                           
            int rc = sftp_server_init(sftp);
            if (rc != SSH_OK)
            {
               fprintf(stderr, "Error initializing SFTP session: %i.\n", sftp_get_error(sftp));
               sftp_free(sftp);
            }

            // handle communication...
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...