该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. 链表的游标(cursor)实现

    诸如BASIC和FORTRAN等许多语言都不支持指针.如果需要链表而又不能使用指针,这时我们可以使用游标(cursor)实现法来实现链表. 在链表的实现中有两个重要的特点: 数据存储在一组结构体中.每 ...

  2. MVC4怎样在cshtml的引号内添加变量?

    @{;} @foreach (var item in Model) { i++; <tr> <td style="text-align:center">@i ...

  3. INV*更新物料信息

    物料 PROCEDURE update_item(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false, x_return_status OUT NO ...

  4. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统

    一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...

  5. Android开发之定位系统

    2013-07-04 定位系统 全球定位系统(Global Positioning System, GPS), 又称全球卫星定位系统. 最少只需其中3颗卫星,就能迅速确定用户组地球所处的位置及海拔高度 ...

  6. ML 与 DM 工具 Weka 的使用

    1.关于Weka Weka 的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),是一款免费的.非商业化(与之对应的是SPSS公司商业数据 ...

  7. Eclipse+PyDev 安装和配置(转)

    Python开发有很多工具,其中Eclipse+Pydev 是最常见的一种.本文简单介绍Windows下Eclipse+PyDev 安装和配置. Eclipse 是一种基于 Java 的可扩展开源开发 ...

  8. JAVA编译器常量

    编译器常量的特点就是:它的值在编译期就可以确定.比如: final int i = 5; 再傻的编译器也能在编译时看出它的值是5,不需要到运行时.对于运行时常量,它的值虽然在运行时初始化后不再发生变化 ...

  9. ref与out区别(ref有进有出,而out只出不进)

    ref与out区别(ref有进有出,而out只出不进)   C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...

  10. Bulk Load-HBase数据导入最佳实践

    一.概述 HBase本身提供了非常多种数据导入的方式,通常有两种经常使用方式: 1.使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase 2 ...