Загрузка libssh SFTP внутри потока вылетает на sftp_read

Я использую библиотеку libssh в MFC C ++, в частности, оболочку SFTP. У меня есть код, работающий, когда не используется многопоточность, но я хочу использовать AfxBeginThread, чтобы позволить продолжению действия пользователя.

Я подтвердил, что передаю точно такие же имена файлов и целевые пути сохранения, используя поток или нет — я проверил это путем жесткого кодирования файла для сохранения и назначения для сохранения непосредственно в BeginDownload ().

Существует ли конкретный способ использования оболочки SFTP для libssh, чтобы загрузка выполнялась в потоке? Я хотел бы позволить пользователям загружать несколько файлов одновременно из одного и того же экземпляра объектов ssh и просто запускать новый поток каждый раз, когда необходимо загрузить файл.

Вот что я использую для фактической загрузки. m_sftp_sesssion — это мой объект sftp_session, созданный при входе в систему.

bool CSFtpManager::BeginDownload(CString filename, CString savefilename)
{
sftp_dir dir = sftp_opendir(m_sftp_session, "../../../directory");
sftp_attributes attrs = sftp_readdir(m_sftp_session, dir);

int access_type = O_RDONLY;
sftp_file file;
file = sftp_open(m_sftp_session, "../../../directory/myfile.zip", access_type, 0);

const char* x2 = ssh_get_error(m_ssh_session);
if(file == NULL)
{
int a;
}
int nbytes;
char buffer[1024];
FILE * pFile;
pFile = fopen(CStringA(savefilename), "wb");
nbytes = sftp_read(file, buffer, sizeof(buffer)); //this is crashing inside a thread
while(nbytes > 0)
{
fwrite(buffer, sizeof(char), sizeof(buffer), pFile);
nbytes = sftp_read(file, buffer, sizeof(buffer));
}
fclose(pFile);
sftp_close(file);
return true;
}

Вот мой метод входа в систему, где мои объекты libssh устанавливаются в переменных-членах для дальнейшего использования. Включена закомментированная строка, вызывающая мой BeginDownload. Вызов его вне потока (т. Е. Нажатие кнопки входа в систему) работает.

bool CSFtpManager::login()
{
int verbosity = SSH_LOG_PROTOCOL;
m_ssh_session = ssh_new();
ssh_options_set(m_ssh_session, SSH_OPTIONS_HOST, "ftp3 host..");
//setting username and password...
ssh_options_set(m_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
ssh_options_set(m_ssh_session, SSH_OPTIONS_PORT, &m_iPort);

int x = ssh_connect(m_ssh_session);
const char* x2 = ssh_get_error(m_ssh_session);if(rc != SSH_AUTH_SUCCESS)
{
return false;
}

m_sftp_session;
m_sftp_session = sftp_new(m_ssh_session);

//Calling BeginDownload here does work
//BeginDownload(L"file.txt", L"T:\\file.txt");
... }

Вот что я использую для вызова точно такой же функции через поток

CWinThread* pThread2 = AfxBeginThread(BeginSFTPDownload, bundle);

И метод запускается через выше:

UINT CMainFrame::BeginSFTPDownload( LPVOID pParam)
{
pSft->BeginDownload(L"test.txt", L"T:\\test.txt");
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]