SFTP客户端代码示例
环境:libssh2 1.4.3、zlib-1.2.8、openssl-1.0.1g
Author: Kagula
最后更新日期:2014-5-18
从http://www.libssh2.org/下载libssh2-1.4.3.tar.gz文件,解压后打开libssh2.dsw文件升级项目到VisualStudio 2013,里面有两个项目,只要编译libssh2项目就可以了。编译前需要添加zlib和openssl的头文件和库文件链接位置,如果编译libssh2提示找不到msvcrt.lib,为链接库添加下面的路径
C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\lib
提示找不到ws2_32.lib或odbc32.lib,添加下面的链接路径
C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Lib
编译通过后文件输出到\libssh2-1.4.3\win32\Release_lib路径下
下面是SFTP客户端示例代码
#include "SFTP_Libssh2.h"
#include <iostream>
int main(int argc, char* argv[])
{
//下面的代码只要在进程初始化的时候执行
kagula::network::SFTP_Init();
//测试SFTP链接
kagula::network::SFTP_Libssh2* client = kagula::network::SFTP_Libssh2::Inst();
std::string ip = "192.168.19.130";
uint16_t port = 22;
std::string usr = "kagula";
std::string pwd = "123456";
if (false == client->IsAbilityConn(ip, port, usr, pwd))
{
std::cout << client->strLastError << std::endl;
return -1;
}
//测试文件上传,d:\\temp\\a.html
if (0 != client->upload(ip, 22, usr, pwd, "d:\\temp\\a.html", "/home/kagula/a.html"))
{
std::cout << "Error:" << client->strLastError << std::endl;
} else
{
std::cout << client->strLastError << std::endl;
}
//测试文件下载
if (0 != client->download(ip, 22, usr, pwd, "/home/kagula/a.html","d:\\temp\\b.html" ))
{
std::cout << "Error:" << client->strLastError << std::endl;
}
else
{
std::cout << client->strLastError << std::endl;
}
//进程准备结束,释放资源的时候,运行下面的代码
kagula::network::SFTP_Exit();
return 0;
}
SFTP_Libssh2.h
#pragma once
#include <string>
#include <atomic>
/*
功能:SFTP协议的文件传输功能
最后更新日期:2014-5-17
简介:借助Libssh2库很容易实现sftp,ssh2客户端,这里给出
如何实现Sftp客户端的代码
测试环境:Windows 8.1 64bit、Visual Studio 2013 Professional SP1
OpenSSL 1.0.1g、zlib-1.2.8、libssh2 1.4.3
Win32控制台项目
注意:动态链接需要把“libssh2.dll”文件复制到当前项目路径下
说明:原来的代码支持多线程,从应用程序抽出来的时候简化了,
你可以修改代码使它同时支持上传或下载多个文件。
建议:[1]第三方库直接下载源代码自己编译免得库由于编译器版本的
不同或设置的不同链接的时候一大堆麻烦。
[2]读懂代码根据项目需求作相应修改
补充阅读资料:
《使用libssh2库实现支持密码参数的ssh2客户端》
http://blog.chinaunix.net/uid-24382173-id-229823.html
*/
namespace kagula {
namespace network {
int SFTP_Init();
void SFTP_Exit();
class SFTP_BKCall
{
public:
/* progress返回值范围[0.0,1.0] */
virtual void OnProgress(float progress) = 0;
};
class SFTP_Libssh2
{
public:
static SFTP_Libssh2* Inst()
{
static SFTP_Libssh2 inst;
return &inst;
}
/*
入口参数使用说明
ip: 就填一个IP地址就好了,例如“127.0.0.1”。
port: 端口,SFTP服务器默认端口为22。
username:
password:
sftppath: 远程路径“/”开头 ,例如“/a.jpg”
localpath: 本地路径,例如“d:\\temp\\test.jpg”
strLastError: 错误信息
出口参数
返回不等于零,代表失败!
*/
int upload(std::string ip, unsigned short port, std::string username,
std::string password, std::string localpath, std::string remotepath);
int download(std::string ip, unsigned short port, std::string username,
std::string password, std::string sftppath, std::string localpath);
//测试SFTP服务器是否可以链接
bool IsAbilityConn(std::string ip, unsigned short port, std::string username,
std::string password);
//设置回掉函数
void SetBKCall(SFTP_