一、源代码说明
freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。
本文介绍的是freecplus框架的ftp客户端Cftp类。
Cftp类的声明文件是freecplus/_ftp.h。
Cftp类的定义文件是freecplus/_ftp.cpp。
示例程序位于freecplus/demo目录中。
编译规则文件是freecplus/demo/makefile。
Cftp类是在ftplib开源库的基础之上做了二次封装,ftplib开源库的头文件是freecplus/ftplib.h,函数定义文件是freecplus/ftplib.c。
ftplib是C代码,用gcc先编译成lib库文件后,再用g++和_ftp.cpp以及目标文件一起编译。
二、概述
本文不会介绍ftp协议的基础知识和ftp命令,在阅读本文之前,您必须熟悉ftp协议和命令才能看懂本文的内容。
三、Cftp类
类的声明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| class Cftp { public: netbuf *m_ftpconn; unsigned int m_size; char m_mtime[21];
bool m_connectfailed; bool m_loginfailed; bool m_optionfailed;
Cftp(); ~Cftp();
void initdata();
bool login(const char *host,const char *username,const char *password,const int imode=FTPLIB_PASSIVE); bool logout();
bool mtime(const char *remotefilename);
bool size(const char *remotefilename);
bool chdir(const char *remotedir);
bool mkdir(const char *remotedir);
bool rmdir(const char *remotedir);
bool nlist(const char *remotedir,const char *listfilename);
bool get(const char *remotefilename,const char *localfilename,const bool bCheckMTime=true);
bool put(const char *localfilename,const char *remotefilename,const bool bCheckSize=true);
bool ftpdelete(const char *remotefilename);
bool ftprename(const char *srcremotefilename,const char *dstremotefilename);
bool dir(const char *remotedir,const char *listfilename);
bool site(const char *command);
char *response(); };
|
四、准备测试环境
在演示示例程序之前,我认为您已经是一个职业的C/C++程序员,熟悉Linux操作系统、熟悉ftp协议。
1、创建Linux操作系统用户
创建freecplus用户,用户组为bin,用户根目录为/home/freecplus,密码为freecpluspwd
2、安装配置ftp服务器
具体操作请参考C语言技术网(www.freecplus.net)的相关文章,或在网上搜索相关的文章。
3、配置防火墙
具体操作请参考C语言技术网(www.freecplus.net)的相关文章,或在网上搜索相关的文章。
4、准备测试的文件
把freecplus框架的源代码复制到/home/freecplus目录,如下:
五、示例程序
1、获取服务器文件列表、时间和大小
示例(demo50.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#include "../_ftp.h"
int main(int argc,char *argv[]) { Cftp ftp;
if (ftp.login("172.16.0.15:21","freecplus","freecpluspwd",FTPLIB_PASSIVE) == false) { printf("ftp.login(172.16.0.15:21(freecplus/freecpluspwd)) failed.\n"); return -1; }
if (ftp.nlist("/home/freecplus/*.h","/tmp/list/tmp.list")==false) { printf("ftp.nlist() failed.\n"); return -1; }
CFile File; char strFileName[301];
File.Open("/tmp/list/tmp.list","r");
while(true) { if (File.Fgets(strFileName,300,true)==false) break;
ftp.mtime(strFileName); ftp.size(strFileName); printf("filename=%s,mtime=%s,size=%d\n",strFileName,ftp.m_mtime,ftp.m_size); } }
|
运行效果
2、把文件上传到服务器
示例(demo51.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
#include "../_ftp.h"
int main(int argc,char *argv[]) { Cftp ftp;
if (ftp.login("172.16.0.15:21","freecplus","freecpluspwd",FTPLIB_PASSIVE) == false) { printf("ftp.login(172.16.0.15:21(freecplus/freecpluspwd)) failed.\n"); return -1; }
if (ftp.mkdir("/home/freecplus/tmp")==false) { printf("ftp.mkdir() failed.\n"); return -1; } if (ftp.chdir("/home/freecplus/tmp")==false) { printf("ftp.chdir() failed.\n"); return -1; }
ftp.put("demo51.cpp","demo51.cpp");
printf("put demo51.cpp ok.\n"); }
|
3、从服务器下载文件
示例(demo52.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#include "../_ftp.h"
int main(int argc,char *argv[]) { Cftp ftp;
if (ftp.login("172.16.0.15:21","freecplus","freecpluspwd",FTPLIB_PASSIVE) == false) { printf("ftp.login(172.16.0.15:21(freecplus/freecpluspwd)) failed.\n"); return -1; }
if (ftp.get("/home/freecplus/tmp/demo51.cpp","/tmp/test/demo51.cpp")==false) { printf("ftp.get() failed.\n"); return -1; }
printf("get /home/freecplus/tmp/demo51.cpp ok.\n");
if (ftp.ftpdelete("/home/freecplus/tmp/demo51.cpp")==false) { printf("ftp.ftpdelete() failed.\n"); return -1; }
printf("delete /home/freecplus/tmp/demo51.cpp ok.\n");
if (ftp.rmdir("/home/freecplus/tmp")==false) { printf("ftp.rmdir() failed.\n");return -1; } }
|
六、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道