针对embedded式Linux的简单的CC ++ FTP和SFTP客户端库推荐

针对embedded式Linux的简单的CC ++ FTP和SFTP客户端库推荐,第1张

概述针对embedded式Linux的简单的C / C ++ FTP和SFTP客户端推荐

任何人都可以推荐基于linux的embedded式系统的FTP / SFTP客户端C / C ++库吗? 我知道Curl库,但我需要尽可能简单的东西来从FTP / SFTP服务器下载文件。 有什么build议要找? 是的,SFTP支持是至关重要的。 其实我甚至可以牺牲multithreading,因为我一次只需要一个stream。 我希望能够通过内存缓冲区,但这应该不是一个问题。

先谢谢你。

更新:


花了一些时间与libcurl后,我决定不采取这种方式,赞成直接使用SFTP的libssh2和重用专有的FTP库从不同的项目。 libcurl似乎也和curl命令行工具的方法挂钩。 例如,尝试在开始下载 *** 作之前获取远程文件大小 – 这绝对没有计划。

但实际上,另一个命题是受欢迎的,特别是我根本没有看到真正简单的公共C或C ++ FTP客户端库。 一切都是非常古老,不支持或新鲜和潮湿。

为什么这个应用程序不会消耗尽可能多的内存预期

如何在Visual Studio 2010中使用Boost

没有声音。 通过RubyDL使用Ruby和winmm

分叉和执行许多不同的过程,并从每一个获得结果

linux和windows之间的串行通信

致命错误RC1015

“(gdb)在qemu仿真arm架构上运行可执行文件时运行”崩溃

为什么结构和工会之间的尺寸不匹配?

需要UAC保护资源的整个列表以标准用户身份运行我的应用程序(unlevated)

为什么malloc不是“用尽”我的电脑上的内存?

libssh2是SFTP的一个很好的库 – 它也恰好是(lib)curl用于SFTP的库。

你看过libcurl的替代页面吗? 有几个选项可能会提供一个FTP解决方案。

我想如果你离开libcurl,你可能需要使用两个不同的库,一个用于SFTP(实际上只是SSH),一个用于FTP。

但是,如果你不想这样做,也许你想看看编译libcurl来链接到cyaSSL或PolarsSL而不是openssl,使安装更轻量级。 您也可以尝试使用最少的选项进行编译,因为您只需要FTP和SFTP支持。

希望这可以帮助。

你可以使用libssh作为sftp。 我在这里给你一些有暂停/恢复和在windows上工作的代码。 对于linux你需要替换本地文件处理函数。 我不能复制整个班级,因为它会超过这个网站的限制。 将用户名和密码以及主机名更改为您的sftp服务器的相应等效项:

int main(array<System::String ^> ^args) { //Console::Writeline(L"Hello World"); pSFTPConnector sshc = new SFTPConnector(L".\",L"127.0.0.1",22,L"iman",L"iman"); // change the hostname,port,username,password to your sftp server,your credentials //file *nullfile = fopen("null","w"); //sshc->setLogfile(nullfile); sshc->setVerbosity(SSH_LOG_RARE); // you can change the verbosity as appropriate for you int i= sshc->InitSession(); i=sshc->ConnectSession(); i = sshc->InitSFTP(); //i = sshc->SFTPrename("renamed_myfile.txt","myfile.txt"); //change these file names //i = sshc->Makedir("sftpdir"); //i = sshc->testUploadfile("myfile2.txt","1234567890testfile"); // change these file names to whatever appropriate //i = sshc->SFTPget("c:\testdir\Got_CAR_HIRE_FINAL_test.jpg","CAR_HIRE_FINAL_test.jpg",64*1024 ); i = sshc->SFTPget("c:\testdir\get_downloaded_CAR_HIRE_FINAL.jpg","CAR_HIRE_FINAL.jpg",64 *1024); i = sshc->SFTPreget("c:\testdir\reget_downloaded_CAR_HIRE_FINAL.jpg",64 * 1024); i = sshc->SFTPput("c:\testdir\CAR_HIRE_FINAL.jpg","put_CAR_HIRE_FINAL.jpg",64 * 1024); i = sshc->SFTPreput("c:\testdir\CAR_HIRE_FINAL.jpg","reput_CAR_HIRE_FINAL.jpg",64 * 1024); delete sshc; return 0; } typedef enum sshconerr{ E_OK = 1,E_SESSION_ALOC = -1,E_SSH_CONNECT_ERR = -2,E_SFTP_ALLOC = -3,E_INIT_SFTP = -4,E_CREATE_DIR = -5,E_fileOPEN_WRITE = -6,E_WRITE_ERR = -7,E_file_CLOSE = -8,E_file_OPEN_READ = -9,E_INVALID_ParaMS = -10,E_SFTP_ERR = -11,E_SFTP_READ_ERR = -12,E_SFTP_READBYTES_ERR = -13,E_GET_fileINF = -14,E_LOCAL_file_NOTFOUND = -15,E_REname_ERR = -16,E_MEM_ALLOC = -17,E_LOCAL_file_READ = -18,E_LOCAL_file_RDWR = -19,E_REMOTEfile_SEEK = -20,E_REMOTE_file_OPEN = -21,E_DELETE_ERR = -22,E_REname_LOCAL_file = -23,E_LOCAL_DELETE_file = -24,E_fileOPEN_RDONLY = -25,E_SFTP_READ_EOF=-26,E_UNKNowN=-999 } ESSHERR; // status of transfers; typedef enum sftpstat{ ES_DONE=0,ES_INPROGRESS,ES_Failed,ES_STARTING,ES_PAUSED,ES_RESUMING,ES_CANCELLED,ES_NONE } ESFTPSTAT; using namespace std; // statistics about the transfer; typedef struct transferstatstruct { string remote_file_name; string local_file_name; __int64 total_size; __int64 transferred; __int64 averagebps; long long seconds_elapsed; long long seconds_remained; int percent; ESFTPSTAT transferstate; } TTransstat; #define E_SESSION_NEW -1 // these librarIEs are required #pragma comment(lib,"ssh.lib") // this is the main class that does the majority of the work typedef class CSFTPConnector{ private: ssh_session session; // ssh session sftp_session sftp; // sftp session sftp_file file; // structure for a remote file file *localfile; // not used in windows but Could be local file pointer in UNIX file *logfile; // the file for writing logs,default is set to stderr string filename; // file name of the transfer; string localfilename; // file name of local file; string tempfilename; // a temporaty file name will be used during the transfer which is renamed when transfer is completed. ESFTPSTAT transferstatus; // state of the transfer which has one of the above values (ESFTPSTAT) time_t transferstarttime; // time of start of the transfer wchar_t username[SHORT_BUFF_LEN]; wchar_t password[SHORT_BUFF_LEN]; wchar_t hostname[SHORT_BUFF_LEN]; // hostname of the sftp server wchar_t basedir[SHORT_BUFF_LEN]; // this base dir is the directory of public and private key structur ( NOT USED IN THIS VERSION) int port; // port of the server; int verbosity; // degree of verbosity of libssh __int64 filesize; // total number of bytes to be transfered; DWORD local_file_size_hIDWORD; // Bill Gates cannot accept the file size without twisting the programmers,so he accepts them in 2 separate words like this DWORD local_file_size_lowDWORD; // these 2 DWORDs when connected together comprise a 64 bit file size. __int64 lfilesize; // local file size __int64 rfilesize; // remote file size __int64 transfered; // number of bytes already transfered bool pause; // pause flag TTransstat stats; // statistics of the transfer HANDLE localfilehandle; // windows uses handles to manipulate files. this is the handle to local file. ESSHERR CSFTPConnector::rwopen_existing_SFTPfile(char *fn); // open a file on remote ( server ) read/write for upload ESSHERR CSFTPConnector::rdopen_existing_SFTPfile(char *fn); // open a file on remote ( server ) read only for download ESSHERR createSFTPfile(char *fn); // create a file on server; ESSHERR writeSFTPfile(char *block,size_t blocksize); // write a block of data to the open remote file ESSHERR readSFTPfile(char *block,size_t len,size_t *bytesread); // read a block of data from the open remote file ESSHERR readSFTPfile(char *block,__int64 len,DWORD *bytesread); ESSHERR closeSFTPfile(); // closes the remote file; ESSHERR openSFTPfile(char *fn); // opens the remote file ESSHERR getSFTPfileinfo(); // gets information about the remote file public: wstring errstring; // the string describing last error ESSHERR Err; // error code of last error CSFTPConnector(); // default constructor; CSFTPConnector(wchar_t *dir,wchar_t *hn,int hostport,wchar_t *un,wchar_t *pass); // constructor voID setVerbosity(int v); int getVerbosity(); ESSHERR InitSession(); // must be called befor doing any transfer ESSHERR ConnectSession(); // connnects to the ssh server ESSHERR InitSFTP(); // must be called befor doing any transfer ESSHERR Makedir(char *newdir); ESSHERR testUploadfile(char *fn,char *block); // do not use this,only for test purposes for myself ESSHERR SFTPput(char *lfn,char *rfn,size_t blocksize); // Upload a file from start ESSHERR SFTPreput(char *lfn,size_t blocksize); // checks for prevIoUse interrupted transfer,then either continues the prevIoUse transfer ( if there was any) or starts a new one (UPLOAD) ESSHERR SFTPrename(char *newname,char *oldname); // renames a remote file( must be closed) ESSHERR CSFTPConnector::SFTPdelete(char *remfile); // deletes a remote file TTransstat getStatus(); // gets statistics of the transfer ESSHERR CSFTPConnector::SFTPget(char *lfn,size_t blocksize); // Downloads a file from sftp server ESSHERR CSFTPConnector::SFTPreget(char *lfn,then either continues the prevIoUse transfer ( if there was any) or starts a new one (DOWNLOAD) voID CancelTransfer(); voID PauseTransfer(); voID setLogfile(file *logf); // sets the log file,if not set stderr will be used. by default. voID CloseLocalfile(); voID CloseRemotefile(); ~CSFTPConnector(); } SFTPConnector,*pSFTPConnector ; voID CSFTPConnector::CloseLocalfile() { CloseHandle(localfilehandle); } voID CSFTPConnector::CloseRemotefile() { sftp_close(file); } voID CSFTPConnector::setLogfile(file *logf) { logfile = logf; } voID CSFTPConnector::CancelTransfer() { transferstatus = ES_CANCELLED; } voID CSFTPConnector::PauseTransfer() { transferstatus = ES_PAUSED; pause = true; } //---------------------------------------- ESSHERR CSFTPConnector::SFTPget(char *lfn,size_t blocksize) { DWORD result; int rc; BOol bresult; DWORD bytesread; filesize = 0; transfered = 0; pause = false; transferstatus = ES_NONE; char *block; struct stat st; wchar_t temp[SHORT_BUFF_LEN]; size_t tempsize; wstring wlfn; int loopcounter = 0; localfilename = lfn; filename = rfn; tempfilename = string(lfn) + ".sftp_temp"; mbstowcs_s(&tempsize,temp,tempfilename.c_str(),SHORT_BUFF_LEN); localfilehandle = Createfile(temp,GENERIC_READ | GENERIC_WRITE,NulL,OPEN_ALWAYS,file_ATTRIBUTE_norMAL,NulL); if (localfilehandle == INVALID_HANDLE_VALUE) { transferstatus = ES_Failed; errstring = L"Could not open local file:" + wstring(temp) + L" for read and write"; Err = E_LOCAL_file_RDWR; return E_LOCAL_file_RDWR; } lfilesize =0; transfered =0; block = (char*)malloc(blocksize + 1); if (block == NulL) { Err = E_MEM_ALLOC; transferstatus = ES_Failed; errstring = L"Could not allocate memory for file block size"; CloseLocalfile(); return E_MEM_ALLOC; } result = rdopen_existing_SFTPfile((char *)rfn); if (result == E_OK){ getSFTPfileinfo(); filesize = rfilesize; } else { Err = E_REMOTE_file_OPEN; transferstatus = ES_Failed; errstring = L"Could not open remote file"; CloseLocalfile(); delete block; return E_REMOTEfile_SEEK; } transferstatus = ES_STARTING; sftp_file_set_blocking(file); transferstarttime = time(NulL); transferstatus = ES_INPROGRESS; while (transferstatus != ES_Failed && transferstatus != ES_PAUSED && transferstatus != ES_CANCELLED &&transferstatus != ES_DONE) { loopcounter++; result = readSFTPfile(block,blocksize,(size_t *)&bytesread); if (result != E_OK && result!= E_SFTP_READ_EOF ) { errstring = L"Error reading from remote sftp server file."; Err = (ESSHERR)result; transferstatus = ES_Failed; CloseRemotefile(); CloseLocalfile(); delete block; return (ESSHERR)result; } if (result == E_SFTP_READ_EOF) transferstatus = ES_DONE; fprintf(logfile,"Read %d bytes from input file. Number of packets: %d,%llu from %llu bytesn",bytesread,loopcounter,transfered,filesize); bresult = Writefile(localfilehandle,(LPVOID)block,&bytesread,NulL); if (bytesread < blocksize) { if (bresult == FALSE) { errstring = L"Error writing to local file."; Err = E_LOCAL_file_RDWR; transferstatus = ES_Failed; CloseRemotefile(); CloseLocalfile(); delete block; return E_LOCAL_file_RDWR; } else if (bytesread == 0) { errstring = L"Transfer done."; Err = E_OK; transferstatus = ES_DONE; continue; } } Err = E_OK; if (pause == true) transferstatus = ES_PAUSED; if (bresult == TRUE && bytesread == 0) { // at the end of the file transferstatus = ES_DONE; } Sleep(BLOCKTRANSDELAY); if (loopcounter % 331 == 0)Sleep(77 * BLOCKTRANSDELAY); if (loopcounter % 3331 == 0)Sleep(777 * BLOCKTRANSDELAY); } // closing files result = closeSFTPfile(); CloseHandle(localfilehandle); Sleep(1000); if (transferstatus == ES_DONE) { wchar_t temp2[SHORT_BUFF_LEN]; mbstowcs_s(&tempsize,temp2,lfn,SHORT_BUFF_LEN); bresult = Movefile(temp,temp2); if (bresult != TRUE) { Err = E_REname_LOCAL_file; errstring = L"Could not rename local file: " + wstring(temp); transferstatus = ES_Failed; delete block; return E_REname_LOCAL_file; } } if (transferstatus == ES_CANCELLED) { wchar_t temp2[SHORT_BUFF_LEN]; mbstowcs_s(&tempsize,SHORT_BUFF_LEN); bresult = Deletefile(temp); if (bresult != TRUE) { Err = E_LOCAL_DELETE_file; errstring = L"Could not rename local file: " + wstring(temp); transferstatus = ES_Failed; delete block; return E_LOCAL_DELETE_file; } } delete block; return (ESSHERR) result; } TTransstat CSFTPConnector::getStatus() { stats.seconds_elapsed = time(NulL) - transferstarttime; stats.averagebps = (transfered * 8) / stats.seconds_elapsed; if (filesize > 0) { stats.percent = (transfered *100)/ filesize; stats.seconds_remained = ((filesize - transfered) * 8) / stats.averagebps; } else { stats.percent = -1; stats.seconds_remained = -1; } stats.total_size = filesize; stats.transferstate = transferstatus; stats.remote_file_name = filename; stats.local_file_name = localfilename; return stats; } ESSHERR CSFTPConnector::SFTPrename(char *newname,char *oldname) { int rc=sftp_rename(sftp,oldname,newname); if (rc !=SSH_OK){ return E_REname_ERR; } return E_OK; } ESSHERR CSFTPConnector::SFTPdelete(char *remfile) { int rc = sftp_unlink(sftp,remfile); if (rc != SSH_OK){ return E_DELETE_ERR; } return E_OK; } ESSHERR CSFTPConnector::SFTPreput(char *lfn,size_t blocksize) { ESSHERR result; BOol bresult; DWORD bytesread; filesize = 0; transfered = 0; pause = false; transferstatus = ES_NONE; char *block; struct stat st; wchar_t temp[SHORT_BUFF_LEN]; size_t tempsize; wstring wlfn; int loopcounter = 0; localfilename = lfn; //wlfn = wstring(lfn); //localfile = fopen(lfn,L"r"); filename = rfn; mbstowcs_s(&tempsize,SHORT_BUFF_LEN); //filesize = getfileSize(localfilename); /*if(filesize < 0) { transferstatus = ES_Failed; Err = E_LOCAL_file_NOTFOUND; return E_LOCAL_file_NOTFOUND; }*/ localfilehandle = Createfile(temp,GENERIC_READ,file_SHARE_READ,OPEN_EXISTING,NulL); if (localfilehandle == INVALID_HANDLE_VALUE) { transferstatus = ES_Failed; Err = E_LOCAL_file_NOTFOUND; return E_LOCAL_file_NOTFOUND; } local_file_size_lowDWORD = GetfileSize(localfilehandle,&local_file_size_hIDWORD); filesize = (local_file_size_hIDWORD * 0x100000000) + local_file_size_lowDWORD; if (filesize < 0) { transferstatus = ES_Failed; Err = E_LOCAL_file_NOTFOUND; CloseLocalfile(); return E_LOCAL_file_NOTFOUND; } block = (char*)malloc(blocksize + 1); if (block == NulL) { Err = E_MEM_ALLOC; transferstatus = ES_Failed; errstring = L"Could not allocate memory for file block size"; CloseLocalfile(); return E_MEM_ALLOC; } tempfilename = string(rfn) + ".sftp_temp"; result = rwopen_existing_SFTPfile((char *)tempfilename.c_str()); if (result == E_OK){ getSFTPfileinfo(); sftp_seek64(file,rfilesize); __int64 tempi64 = rfilesize & 0x00000000FFFFFFFF; DWORD DWlow = tempi64; tempi64 = (rfilesize & 0x7FFFFFFF00000000); tempi64 = tempi64 >> 32; long DWhi = tempi64; DWORD DWResult=SetfilePointer(localfilehandle,DWlow,&DWhi,file_BEGIN); if (DWResult == INVALID_SET_file_POINTER) { transferstatus = ES_Failed; Err = result; return result; } transferstatus = ES_RESUMING; transfered = rfilesize; } else{ result = createSFTPfile((char *)tempfilename.c_str()); transferstatus = ES_STARTING; if (result != E_OK) { transferstatus = ES_Failed; Err = result; CloseLocalfile(); return result; } } sftp_file_set_blocking(file); transferstarttime = time(NulL); transferstatus = ES_INPROGRESS; while (transferstatus != ES_Failed && transferstatus != ES_PAUSED && transferstatus != ES_DONE) { loopcounter++; bresult = Readfile(localfilehandle,NulL); fprintf(logfile,filesize); if (bytesread < blocksize) { if (bresult == FALSE) { errstring = L"Error reading from local file."; Err = E_LOCAL_file_READ; transferstatus = ES_Failed; CloseRemotefile(); CloseLocalfile(); return E_LOCAL_file_READ; } else if (bytesread == 0) { errstring = L"Transfer done."; Err = E_OK; transferstatus = ES_DONE; continue; } } result = writeSFTPfile(block,bytesread); if (result != E_OK && bytesread>0 ) { errstring = L"Error transmitting to remote sftp server file."; Err = result; transferstatus = ES_Failed; CloseRemotefile(); CloseLocalfile(); return result; } Err = E_OK; //transfered = transfered + bytesread; if (pause == true) transferstatus = ES_PAUSED; if (bresult == TRUE && bytesread == 0) { // at the end of the file transferstatus = ES_DONE; } Sleep(BLOCKTRANSDELAY); if (loopcounter % 331 == 0)Sleep(77 * BLOCKTRANSDELAY); if (loopcounter % 3331 == 0)Sleep(777 * BLOCKTRANSDELAY); } CloseRemotefile(); CloseLocalfile(); Sleep(1000); if (transferstatus == ES_CANCELLED) { result = SFTPdelete((char *)tempfilename.c_str()); if (bresult != E_OK) { Err = E_DELETE_ERR; errstring = L"Could not delete remote file."; transferstatus = ES_Failed; return E_DELETE_ERR; } } if (transferstatus == ES_DONE) result = SFTPrename(rfn,(char *)tempfilename.c_str()); delete block; return result; } ESSHERR CSFTPConnector::getSFTPfileinfo() { sftp_attributes fileinf = sftp_fstat(file); if (fileinf == NulL){ return E_GET_fileINF; } rfilesize = fileinf->size; sftp_attributes_free(fileinf); return E_OK; } ESSHERR CSFTPConnector::closeSFTPfile() { int rc = sftp_close(file); if (rc != SSH_OK) { fprintf(logfile,"Can't close the written file: %sn",ssh_get_error(session)); return E_file_CLOSE; } return E_OK; } ESSHERR CSFTPConnector::writeSFTPfile(char *block,size_t blocksize) { size_t nwritten = sftp_write(file,block,blocksize); if (nwritten != blocksize) { fprintf(logfile,"Can't write data to file: %sn",ssh_get_error(session)); //sftp_close(file); transfered = transfered + nwritten; return E_WRITE_ERR; } transfered = transfered + nwritten; return E_OK; } ESSHERR CSFTPConnector::readSFTPfile(char *block,size_t *bytesread) { DWORD readbytes; *bytesread = 0; if (len <= 0) return E_INVALID_ParaMS; if (bytesread == NulL || block == NulL) return E_INVALID_ParaMS; readbytes = sftp_read(file,len); if (readbytes < 0) { fprintf(logfile,"Can't read from remote file: %s %sn",filename.c_str(),ssh_get_error(session)); *bytesread = 0; return E_SFTP_READ_ERR; } if (readbytes < len) { *bytesread = readbytes; transfered = transfered + readbytes; return E_SFTP_READ_EOF; } *bytesread = readbytes; transfered = transfered + readbytes; return E_OK; } ESSHERR CSFTPConnector::readSFTPfile(char *block,DWORD *bytesread) { DWORD readbytes; *bytesread = 0; if (len <= 0) return E_INVALID_ParaMS; if (bytesread == NulL || block == NulL) return E_INVALID_ParaMS; readbytes = sftp_read(file,ssh_get_error(session)); *bytesread = 0; return E_SFTP_READ_ERR; } if (readbytes < len) { *bytesread = readbytes; return E_SFTP_READ_EOF; } *bytesread = readbytes; transfered = transfered + readbytes; return E_OK; } ESSHERR CSFTPConnector::createSFTPfile(char *fn) { int access_type = O_CREAT | O_RDWR; int rc,nwritten; filename = string(fn); file = sftp_open(sftp,fn,access_type,S_IWRITE); if (file == NulL) { fprintf(logfile,"Can't open file for writing: %sn",ssh_get_error(session)); return E_fileOPEN_WRITE; } return E_OK; } ESSHERR CSFTPConnector::rdopen_existing_SFTPfile(char *fn) { int access_type = O_RDONLY ; int rc,S_IREAD); if (file == NulL) { fprintf(logfile,ssh_get_error(session)); return E_fileOPEN_RDONLY; } return E_OK; } ESSHERR CSFTPConnector::openSFTPfile(char *fn) { int access_type = O_RDONLY; int rc,ssh_get_error(session)); return E_file_OPEN_READ; } return E_OK; } ESSHERR CSFTPConnector::Makedir(char *newdir) { int rc; rc = sftp_mkdir(sftp,newdir,S_IFDIR); if (rc != SSH_OK) { if (sftp_get_error(sftp) != SSH_FX_file_ALREADY_EXISTS) { fprintf(logfile,"Can't create directory: %sn",ssh_get_error(session)); return E_CREATE_DIR; } } return E_OK; } SFTPConnector::CSFTPConnector() { //libssh2_init(0); session = ssh_new(); if (session == NulL) { Err = E_SESSION_ALOC; errstring = L"Could not allocate a session."; } wcscpy(hostname,L"localhost" ); wcscpy(username,L"User"); wcscpy(password,L"Password"); wcscpy(basedir,L".\"); port = 22; verbosity = SSH_LOG_RARE; filesize = 0; transfered = 0; pause = false; transferstatus = ES_NONE; logfile = stderr; } CSFTPConnector::CSFTPConnector(wchar_t *dir,wchar_t *pass) { session = ssh_new(); if (session == NulL) { Err = E_SESSION_ALOC; errstring = L"Could not allocate a session."; } wcscpy(hostname,hn); wcscpy(username,un); wcscpy(password,pass); wcscpy(basedir,dir); port = hostport; verbosity = SSH_LOG_RARE; filesize=0; transfered=0; pause=false; transferstatus = ES_NONE; logfile = stderr; } ESSHERR CSFTPConnector::InitSFTP() { int rc; sftp= sftp_new(session); if (session == NulL) { Err = E_SFTP_ALLOC; errstring = L"Could not allocate a sftp session."; } rc = sftp_init(sftp); if (rc != SSH_OK) { fprintf(logfile,"Error initializing SFTP session: %s.n",sftp_get_error(sftp)); sftp_free(sftp); return E_INIT_SFTP; } return E_OK; } ESSHERR CSFTPConnector::ConnectSession() { char temp[SHORT_BUFF_LEN]; size_t n_of_chars; wcstombs_s(&n_of_chars,SHORT_BUFF_LEN,(const wchar_t *)password,SHORT_BUFF_LEN); int ir; ir=ssh_connect(session); if (ir != SSH_OK){ errstring = L"Could not connect the ssh session."; return E_SSH_CONNECT_ERR; } ir=ssh_userauth_password(session,temp); if (ir != SSH_OK){ errstring = L"Could not connect the ssh session."; return E_SSH_CONNECT_ERR; } return E_OK; } ESSHERR CSFTPConnector::InitSession() { char temp[SHORT_BUFF_LEN]; size_t n_of_chars; wcstombs_s(&n_of_chars,(const wchar_t *) hostname,SHORT_BUFF_LEN); ssh_options_set(session,SSH_OPTIONS_HOST,temp); ssh_options_set(session,SSH_OPTIONS_LOG_VERBOSITY,&verbosity); ssh_options_set(session,SSH_OPTIONS_PORT,&port); wcstombs_s(&n_of_chars,(const wchar_t *)username,SSH_OPTIONS_USER,temp); wcstombs_s(&n_of_chars,(const wchar_t *)basedir,SSH_OPTIONS_SSH_DIR,temp); return E_OK; } CSFTPConnector::~CSFTPConnector() { sftp_free(sftp); ssh_disconnect(session); ssh_free(session); return; }

总结

以上是内存溢出为你收集整理的针对embedded式Linux的简单的C / C ++ FTP和SFTP客户端库推荐全部内容,希望文章能够帮你解决针对embedded式Linux的简单的C / C ++ FTP和SFTP客户端库推荐所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1290433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存