该ftp的客服端是在linux下面写,涉及的东西也比较简单,如前ftp的简单介绍,知道ftp主要的工作流程架构,套接字的创建,还有就是字符串和字符的处理。使用的函数都是比较简单平常易见的,写的时候感觉有将以前学的函数从新巩固一遍。这个简易的ftp客服端只是完成了基本的工作,还有许多的问题有待解决。如:目前最大的问题是使用pasv(被动模式)连接的时候,某些情况下会出现运行错误或同一个运行程序中使用两次pasv的被动连接就是出现运行错误而退出。注意:ftp的测试最好是用linux平台下搭建,连接编码不同ftp会出现错误。

转载请标明出处
代码如下:
/*************************
方便测试ftp:172.16.120.77
author:fengbo
*************************/
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<unistd.h>
#include<netdb.h>
#include<curses.h>
#defineMAXSIZE
#definebuff

char*data_port;
intport;
char*p,*ptr;

intc_sockfd,d_sockfd;
intread_status,write_status;
//////////////////////////
charread_buf[];//控制端口缓存
charread_d_buf[];//数据端口缓存
charsend_buf[];
charcommand[];
charcom_input[];//输入字符缓存
charpara_input[];

structsockaddr_inserveraddr_d;
///////////////////////////////
staticvoiddisplay_order();//命令提示
staticvoidftp_d_port();//pasv获得端口
staticvoidftp_c_socket(intargc1,char**argv1);//命令端口创建
staticvoidftp_d_socket(char*argv2);//数据端口创建
staticvoidset_pasv(char*argv3);//设置被动模式
///////////////////////////////
staticvoidftp_c_socket(intargc1,char**argv1){

intret,i,com_len=;
intcom_i=,para_i=;
into_file,r_file,w_file;//文件的描述符
char*com_status,*para_status;
structsockaddr_inserveraddr_c;//网络字节序序存的结构体变量
socklen_tsock_size;

chardir_name[];//dir的当前目录
charfile_name[];
charusername[];
charpassword[];
charcatalog[];//需要cd的目录
chardownload_file[];
charmkdir_catalog[];//创建目录

/////////////////////////
sock_size=sizeof(structsockaddr);
serveraddr_c.sin_family=AF_INET;
serveraddr_c.sin_port=htons();
serveraddr_c.sin_addr.s_addr=inet_addr(argv1[]);
memset(&(serveraddr_c.sin_zero),,);
c_sockfd=socket(AF_INET,SOCK_STREAM,);//创建sock套接字
if(c_sockfd<){

perror("creatsocketerror!\n");
return;
}

ret=connect(c_sockfd,(structsockaddr*)&serveraddr_c,sock_size);
if(ret<){

perror("connecterror!\n");
return;
}
printf("connecttheserverFTPsuccessfully!\n");
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp的链接欢迎信息
if(read_status==-){
perror("errortogaintheftpwelconmeinformation!\n");
}
printf("theinformation:%s\n",read_buf);
/////////////////login//////////////////////////
printf("--------------------------pleasetologin--------------------------\n");
printf("\n");
printf("***username:");
scanf("%s",username);
getchar();
printf("\n");
printf("***password:");
scanf("%s",password);

getchar();
printf("\n");
printf("--------------------------------------------------------------------\n");

///////////////username//////////////////////////
memset(read_buf,,sizeof(read_buf));
sprintf(send_buf,"USER%s\r\n",username);

write_status=write(c_sockfd,send_buf,strlen(send_buf));
if(write_status==-){
perror("failuretosendtheusername\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
if(atoi(read_buf)!=){
printf("errortologintheftp'username'\n");
}
printf("theinformation:%s\n",read_buf);

/////////////////password//////////////////////////
memset(send_buf,,sizeof(send_buf));
memset(read_buf,,sizeof(read_buf));
sprintf(send_buf,"PASS%s\r\n",password);

write_status=write(c_sockfd,send_buf,strlen(send_buf));
if(write_status==-){
perror("failuretosendthepassword\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
if(atoi(read_buf)!=){
printf("errortologintheftp'password'\n");
exit(-);
}
printf("theinformation:%s\n",read_buf);

///////////////////设置PASV模式/////////////////////
//set_pasv();
///////////////获取端口函数/////////////////////////
//ftp_d_port();
////////////////////////////发送数据端口请求/////////
//ftp_d_socket(argv1[1]);
//////////////////displaythecommand////////////////
display_order();
///////////////////////////命令控制//////////////////

while(){
printf("%sftp>",username);
scanf("%s",command);//从键盘获取命令和参数
getchar();
com_len=strlen(command);//长度
if(com_len>){
com_status=strstr(command,"-");//取命令和参数分界点
while(command[com_i]!=*com_status){
com_input[com_i]=command[com_i];
com_i++;
}//获取到命令
//printf("%s\n",com_input);
com_status++;
for(para_i=;para_i<=(com_len-com_i-);para_i++){
para_input[para_i]=*com_status;
com_status++;
}//获取到参数
//printf("%s\n",para_input);
com_i=;
}
else{
strcpy(com_input,command);
}
//////////////////////大小写转换///////////////////
/*for(i=0;i<strlen(command);i++){

if(strcmp("command[i]","a")>=0){
command[i]=(command[i]-32);
}

}*/
set_pasv(argv1[]);
if(strcmp(com_input,"PWD")==){
///////////////////////当前路径/////////////////////////////
memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));

sprintf(send_buf,"PWD\r\n");
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'PWD'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);
}
elseif(strcmp(com_input,"DIR")==){
///////////////////////显示目录文件///////////////////

memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));
strcpy(dir_name,para_input);

sprintf(send_buf,"LIST%s\r\n",dir_name);
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'LIST'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
printf("%s\n",read_buf);
//if(atoi(read_buf)!=){

//printf("errortosetthePASVmodel\n");
//}
memset(read_d_buf,,sizeof(read_d_buf));
while(read(d_sockfd,read_d_buf,sizeof(read_d_buf))>){

printf("%s",read_d_buf);
memset(read_d_buf,,sizeof(read_d_buf));
}
close(d_sockfd);
memset(&serveraddr_d,,sizeof(serveraddr_d));
}
elseif(strcmp(com_input,"QUIT")==){
/////////////////////////////退出/////////////////////////
close(d_sockfd);
printf("数据端口已关闭\n");
memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));

sprintf(send_buf,"QUIT\r\n");
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'RETR'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);
break;
}
elseif(strcmp(com_input,"GET")==){

/////////////////////////////下载文件/////////////////////

memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));
memset(read_d_buf,,sizeof(read_d_buf));

strcpy(download_file,para_input);
sprintf(send_buf,"RETR%s\r\n",download_file);
write_status=write(c_sockfd,send_buf,strlen(send_buf));
if(write_status==-){
perror("failuretosendtheinformationfor'RETR'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);

o_file=open(download_file,O_WRONLY|O_CREAT|O_TRUNC,);//创建文件客服端
if(o_file==-){
printf("errortoopenthe%s\n",file_name);
exit(-);
}

while((r_file=read(d_sockfd,read_d_buf,sizeof(read_d_buf)))>){

write(o_file,read_d_buf,r_file);//写入文件
memset(read_d_buf,,sizeof(read_d_buf));
}
printf("transportthefilesuccessfuly!\n");
close(o_file);
close(d_sockfd);
memset(&serveraddr_d,,sizeof(serveraddr_d));
}
elseif(strcmp(com_input,"CD")==){
///////////////////////跳转目录/////////////////////////////
memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));

strcpy(catalog,para_input);
sprintf(send_buf,"CWD%s\r\n",catalog);
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'DELE'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);
}
elseif(strcmp(com_input,"DEL")==){
///////////////////////删除文件/////////////////////////////
memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));

strcpy(file_name,para_input);
sprintf(send_buf,"DELE%s\r\n",file_name);
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'DELE'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);
}
elseif(strcmp(com_input,"MKDIR")==){
///////////////////////创建目录/////////////////////////////
memset(read_buf,,sizeof(read_buf));
memset(send_buf,,sizeof(send_buf));

strcpy(mkdir_catalog,para_input);
sprintf(send_buf,"MKD%s\r\n",mkdir_catalog);
write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令写入控制套接连接
if(write_status==-){
perror("failuretosendtheinformationfor'DELE'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
//if(atoi(read_buf)!=257){
//printf("errortosetthePASVmodel\n");
//}
printf("%s\n",read_buf);
}
else{
printf("***************thecommanderror!****************\n");
display_order();//显示命令
}
}


}
//////////////////////////PASV被动模式设置/////////////////////////////////
staticvoidset_pasv(char*argv3){
memset(send_buf,,sizeof(send_buf));
memset(read_buf,,sizeof(read_buf));
sprintf(send_buf,"PASV\r\n");
write_status=write(c_sockfd,send_buf,strlen(send_buf));
if(write_status==-){
perror("failuretosendtheinformationfor'PASV'\n");
}
read_status=read(c_sockfd,read_buf,sizeof(read_buf));//读取ftp用户链接的返回信息
if(read_status==-){
perror("errortogaintheftpinformation!\n");
}
printf("%s",read_buf);
if(atoi(read_buf)!=){
printf("errortosetthePASVmodel\n");
}
ftp_d_port();//获取端口
ftp_d_socket(argv3);//数据套接字创建

}
/////////////////////////获取端口函数实现///////////////////////////////////
staticvoidftp_d_port(){

char*port_status1,*port_status2,*index,extend,extend_1;
intport_temp1[],port_temp2[];//当时出现错误,变量为int型
intport_i=,port_ii=,count,count_i,count_ii;
inttemp=,temp1=,temp2,port_point;

port_status1=strstr(read_buf,"(");//取“(”里面的
port_status1++;
for(port_point=;port_point<;port_point++){//取第4个逗号位置
port_status2=strstr(port_status1,",");
port_status2++;
port_status1=port_status2;
}
port_status2=strstr(port_status1,",");//取第5个逗号位置
while(port_status1!=port_status2){
extend=*port_status1;
port_temp1[port_i]=(int)(extend-);//获取5~6逗号间数据
port_i++;
port_status1++;
}
port_status2++;
port_status1=port_status2;
port_status2=strstr(port_status1,")");//取")"的位置
while(port_status1!=port_status2){
extend_1=*port_status1;
port_temp2[port_ii]=(extend_1-);//获得")"之前的数据
port_ii++;
port_status1++;
}
count_i=port_i;
for(count=;count<port_i;count++){
if(count_i==){
count_ii=;
}
elseif(count_i==){
count_ii=;
}
elseif(count_i==){
count_ii=;
}
temp=temp+port_temp1[count]*count_ii;//计算p1
count_i--;
}
count_i=port_ii;
for(count=;count<port_ii;count++){
if(count_i==){
count_ii=;
}
elseif(count_i==){
count_ii=;
}
elseif(count_i==){
count_ii=;
}
temp1=temp1+port_temp2[count]*count_ii;//计算p2
count_i--;
}
port=temp*+temp1;//p1*256+p2
printf("theinformation:%s\n",read_buf);
}
//////////////////////////命令提示////////////////////////////////////////
staticvoiddisplay_order(){
printf("****************************************************\n");
printf("youcaninputtheCommand:\n");
printf("DIR,PWD,GET,PUT,QUIT,CD,DEL,MKDIR\n");
printf("attention:命令和参数间用'-'分开\n");
printf("****************************************************\n");

}
///////////////////////////数据传送端口////////////////////////////////////

staticvoidftp_d_socket(char*argv2){

intret_d;
//structsockaddr_inserveraddr_d;
socklen_tsock_d_size;

sock_d_size=sizeof(structsockaddr);
serveraddr_d.sin_family=AF_INET;
serveraddr_d.sin_port=htons(port);
serveraddr_d.sin_addr.s_addr=inet_addr(argv2);
memset(&(serveraddr_d.sin_zero),,);
d_sockfd=socket(AF_INET,SOCK_STREAM,);
if(d_sockfd<){
perror("creatdata_socketerror\n");
exit(-);
}
ret_d=connect(d_sockfd,(structsockaddr*)&serveraddr_d,sock_d_size);
if(ret_d<){
perror("data_connecterror!\n");
exit(-);
}
printf("connecttheFTPdataportsuccessfully!\n");
}

intmain(intargc,char**argv){

ftp_c_socket(argc,argv);
return;
}

http://xfb2020.blog.163.com/blog/static/198496112201317113750789/

linux 下简单的ftp客户端程序的更多相关文章

  1. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  2. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  3. Linux下简单的取点阵字模程序

    源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...

  4. 使用 Socket 通信实现 FTP 客户端程序(来自IBM)

    FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...

  5. 使用Socket通信实现FTP客户端程序

    FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...

  6. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  7. ftp客户端自动同步 Windows系统简单操作ftp客户端自动同步

    服务器管理工具它是一款功能强大的服务器集成管理器,包含win系统和linux系统的批量连接,vnc客户端,ftp客户端等等实用功能.我们可以使用这款软件的ftp客户端定时上传下载的功能来进实现ftp客 ...

  8. linux下简单的备份的脚本 2 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4577034 之前写过linux下简单的 ...

  9. 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

    目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...

随机推荐

  1. Unity发布各平台路径

    #if UNITY_EDITOR string filepath = Application.dataPath + "/StreamingAssets"; #elif UNITY_ ...

  2. Adobe Audition3.0 找不到所支持的音频设备 请检查您的音频设置

      Adobe Audition 找不到所支持的音频设备 请检查您的音频设置   解决方案:   运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7 ...

  3. UML回想-通信图

        我们对软件project这一大块的学习事实上開始的还是挺早的,而且在后来的学习过程中也不断的涉及到了这些知识. 可是,经过软考的检验来看我对软工这一块的内容掌握的实在是慘不忍睹.基本上就是一出 ...

  4. SQL server 2008里面通过sys.dm_exec_procedure_stats得到存储过程的执行信息--转

    --转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/13/sql-server-2008-sys-dm-exec-procedure-stats. ...

  5. android开发之数据库游标未关闭导致

    replacements=[Ljava.lang.String;@4192fea8HARDWARE=hw7d501lmatchers=[Ljava.lang.String;@4192fe28RADIO ...

  6. linux内核——PAE(物理地址扩展)

    引入PAE机制后,分页模式是怎样的呢? 首先,要搞明白几件事,2.6.11以上版本的linux内核中,存在4中页表(页全局目录,页上级目录,页中级目录,页表),这些页表结构是已经存在于硬盘中的,当进程 ...

  7. 转:【微信小程序】 微信小程序-拍照或选择图片并上传文件

    调用拍照API:https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html?t=20161222#wxchooseimageobj ...

  8. Android SDK中 tools 工具介绍

    Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator ) 它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的Andr ...

  9. 学习C#——性能计数器

    写在前面: 作为Web应用开发前线的一枚小兵,每看到“性能”一词总有种要亮瞎眼的感觉,说到“性能”那就不能不提“数据”,在程序猿.攻城师中不是流行这样一句话吗?“无图无真相”,谁要说谁开发的应用性能有 ...

  10. 实战DeviceIoControl系列之四:获取硬盘的详细信息

    Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...