linux 下简单的ftp客户端程序
该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客户端程序的更多相关文章
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- Linux下简单的取点阵字模程序
源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...
- 使用 Socket 通信实现 FTP 客户端程序(来自IBM)
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- 使用Socket通信实现FTP客户端程序
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- ftp客户端自动同步 Windows系统简单操作ftp客户端自动同步
服务器管理工具它是一款功能强大的服务器集成管理器,包含win系统和linux系统的批量连接,vnc客户端,ftp客户端等等实用功能.我们可以使用这款软件的ftp客户端定时上传下载的功能来进实现ftp客 ...
- linux下简单的备份的脚本 2 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4577034 之前写过linux下简单的 ...
- 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)
目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...
随机推荐
- 从业者生存质量报告之,教育行业里的IT男
当教育遇上互联网,非常多传统教育机构都卡在了技术这道门槛上. 一位教育机构创始人曾这样感叹说:"技术须要文化基因.氛围.教育行业不知道技术这帮兄弟须要什么样的文化,什么样的工作氛围,怎么管理 ...
- Linux mkdir 如何递归创建目录?
mkdir 如何递归创建目录? mkdir –vp 目录1/目录2/目录3 详细介绍: linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目 ...
- js与jQuery方法对比
javascript与jQuery方法对比jquery对象转dom对象 // 方式一(推荐使用) $("input")[0] // 方式二 $("input" ...
- java线程--volatile实现可见性
volatile关键字: 1)能够保证volatile变量的可见性 2)不能保证volatile变量复杂操作的原子性. volatile如何实现内存可见性: 深入来说:通过加入内存屏障和禁止重排序优化 ...
- JDBC 事务(二)回滚到保存点
public class SavePointTest { /** * @param args * @throws SQLException */ public s ...
- Android 中 字符串比较
EditText中getText().toString() 得到的字符串 写法如下if(m_txtAddress.getText().toString()=="") 这样写 是不会 ...
- sql 百分比
select [city], bfb=cast(cast(count(*)*100./(select count(*) from [UserBasicInfo]) as decimal(10,0)) ...
- 如何用C#做一个悬浮窗口程序
用C#做一个像FlashGet的悬浮窗口,其实很简单,不像以前需要调用很多系统API.大致的步骤如下. 首先是主窗体部分,即要判断窗体的状态来决定是否显示悬浮窗口. 局部成员声明: private F ...
- C# Directory类的操作
Directory类位于System.IO 命名空间.Directory类提供了在目录和子目录中进行创建移动和列举操作的静态方法.此外,你还可以访问和操作各种各样的目录属性,例如创建或最后一次修改时间 ...
- How To run OAI eNB (No S1) with USRP X310(1)
How To run OAI eNB (No S1) with USRP X310 1.Things need to be done 1.1 Install Ubuntu 14.04 1.1.1 In ...