该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. IOS手机使用Fiddler抓获HTTPS报文方法

    Configure Fiddler Click Tools > Fiddler Options > Connections. Click the checkbox by Allow rem ...

  2. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

  3. Android蓝牙——HID开发

    代码地址如下:http://www.demodashi.com/demo/13891.html 原文地址: https://blog.csdn.net/VNanyesheshou/article/de ...

  4. Cookie的介绍

    Cookie是某些站点为了辨别用户身份而存在用户本地终端上的数据.Cookie总是保存在client中,可分为内存 Cookie和硬盘Cookie,而依照时间划分.又能够分为非持久Cookie和持久C ...

  5. MySQL修改root密码的各种方法整理(转)

    整理了以下四种在MySQL中修改root密码的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR ' ...

  6. Eclipse使用教程之精华篇

    插件安装方法 插件大概有三种安装方法: 第一种:知道在线安装地址.Eclipse→Help→Install New Software...→地址栏(Work with)中输入安装地址→勾选要安装的插件 ...

  7. http跨域访问

    if (Request.Headers.Get("Origin") != null) { filterContext.HttpContext.Response.AddHeader( ...

  8. eclipse项目引用项目方法

    在Java Build Path中将被引用项目Add加入到引用项目中. 在Deployment Assembly中将被引入项目Add加到配置项中. 这样在项目发布到tomcat中时被引入项目会被打成j ...

  9. C#删除xml指定节点

  10. CentOS-6.5下安装navicat for mysql

    一.安装前准备 安装epel源        安装wine        如果不安装wine,则可能会出现安装完navicat for mysql后无法启动的情况. 二.安装epel源 cd /tmp ...