C语言:自己编写的简易ftp客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能
//简易ftp客户端
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <fcntl.h>
typedef struct sockaddr* sockaddrp;
//命令传输
int sockfd;
//数据传输
int sockfd1;
char buf[4096] = {};
//地址
char buf1[4096] = {};
//帐号、密码
char buf2[4096] = {};
//存放命令名
char tem1[255] = {};
//存放文件名
char tem2[255] = {};
struct sockaddr_in new_addr = {AF_INET};
void func()
{
sprintf(buf,"PASV\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
int a[4];
int b[2];
printf("%s\n",buf);
sscanf(buf,"227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)",&a[0],&a[1],&a[2],&a[3],&b[0],&b[1]);
int msg = b[0]*256+b[1];
sockfd1 = socket(AF_INET,SOCK_STREAM,0);
new_addr.sin_port = htons(msg);
new_addr.sin_addr.s_addr = inet_addr("192.168.6.66");
connect(sockfd1,(sockaddrp)&new_addr,sizeof(new_addr));
}
//目录
void ls_run()
{
sprintf(buf,"LIST\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd1,buf,sizeof(buf),0);
printf("server:%s\n",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s\n",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s\n",buf);
}
//进入目录
void cd_run()
{
//-----------------------------------------------------
sprintf(buf,"CWD %s\n",tem2);
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
sprintf(buf,"PWD\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd1,buf,sizeof(buf),0);
printf("server1:%s",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server2:%s\n",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server3:%s\n",buf);
sprintf(buf1,"%s",buf);
func();
//-------------------------------------------------------
sprintf(buf,"LIST\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd1,buf,sizeof(buf),0);
printf("%s",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server1:%s\n",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server2:%s\n",buf);
}
//下载
void get_run()
{
func();
sprintf(buf,"RETR %s\n",tem2);
send(sockfd,buf,strlen(buf),0);
printf("%s",buf);
bzero(buf,sizeof(buf));
recv(sockfd1,buf,sizeof(buf),0);
int tmp=sizeof(new_addr);
int fd = open(tem2,O_WRONLY|O_CREAT|O_TRUNC,0644);
write(fd,buf,strlen(buf));
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
close(fd);
}
//上传
void put_run()
{
char inf[1024] = {};
func();
int fd = open(tem2,O_RDONLY);
read(fd,inf,strlen(buf));
close(fd);
sprintf(buf,"STOR %s\n",tem2);
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
sprintf(buf,"%s\n",inf);
send(sockfd1,buf,sizeof(buf),0);
close(sockfd1);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
}
//删除
void delete_run()
{
func();
sprintf(buf,"DELE %s\n",tem2);
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
//-------------------------------------------------
sprintf(buf,"LIST\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd1,buf,sizeof(buf),0);
printf("%s",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server1:%s\n",buf);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server2:%s\n",buf);
}
//登陆
void login(void)
{
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s",buf);
//用户帐号输入
printf("输入用户名:");
gets(buf2);
sprintf(buf,"%s %s\n","USER",buf2);
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
//printf("server:%s",buf);
//用户密码输入
printf("输入密码:");
gets(buf2);
sprintf(buf,"%s %s\n","PASS",buf2);
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s",buf);
sprintf(buf,"SYST\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s",buf);
sprintf(buf,"FEAT\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("server:%s",buf);
sprintf(buf,"OPTS UTF8 ON\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
sprintf(buf,"PWD\n");
send(sockfd,buf,strlen(buf),0);
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
printf("%s",buf);
//功能
while(1)
{
printf("ftp> ");
//获取命令
gets(buf);
//命令分支
if(!strcmp(buf,"ls"))
{
func();
ls_run();
close(sockfd1);
continue;
}
if(!strcmp(buf,"bye"))
{
break;
}
sscanf(buf,"%s %s",tem1,tem2);
if(!strcmp(tem1,"cd") )
{
cd_run();
close(sockfd1);
continue;
}
if(!strcmp(tem1,"get"))
{
get_run();
close(sockfd1);
continue;
}
if(!strcmp(tem1,"put"))
{
put_run();
continue;
}
if(!strcmp(tem1,"delete"))
{
delete_run();
close(sockfd1);
continue;
}
}
}
//主函数
int main(int argc,char* argv[])
{
//socket
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return -1;
}
struct sockaddr_in addr = {AF_INET};
addr.sin_port = htons(21);
addr.sin_addr.s_addr = inet_addr(argv[1]);
int ret = connect(sockfd,(sockaddrp)&addr,sizeof(addr));
if(0 > ret)
{
perror("connect");
return -1;
}
login();
close(sockfd);
}
C语言:自己编写的简易ftp客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能的更多相关文章
- [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...
- win7下利用ftp实现华为路由器的配置文件上传和下载
win7下利用ftp实现华为路由器的配置文件上传和下载 1. Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...
- C#通过FTP账号上传、修改、删除文件 FTPClient
下面类文件中,主要做的工作是:从ftp服务器上下载文件把本地文件替换.添加.或删除功能,在替换本地文件时会先备份一下本地的文件,若整个操作都完成了就会发出commit命令,表示全部替换成功.若中间操作 ...
- Java 实现ftp 文件上传、下载和删除
本文利用apache ftp工具实现文件的上传下载和删除.具体如下: 1.下载相应的jar包 commons-net-1.4.1.jar 2.实现代码如下: public class FtpUtils ...
- C# ftp 上传、下载、删除
public class FtpHelper { public static readonly FtpHelper Instance = new FtpHelper(); /// <summar ...
- java上传、下载、删除ftp文件
一共三个类,一个工具类Ftputil.,一个实体类Kmconfig.一个测试类Test 下载地址:http://download.csdn.net/detail/myfmyfmyfmyf/669710 ...
- c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类
有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...
- webDAV服务的开启以及客户端的上传、下载、删除、新建文件夾、列表的代码(C#)
windows server 2003开启webDAV服务 1. 启动“IIS管理器”选择“WEB服务扩展”,选择“WEBDAV”的允许按钮启动WEBDAV功能 2.建立一个虚拟目录,对应到一个本地目 ...
- PHPstorm设置连接FTP,进行文件上传、下载、比较
内容转载自:http://www.cnblogs.com/jikey/p/3486621.html 如何在 ...
随机推荐
- 设计模式——原型模式(Prototype)
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印 ...
- Subversion Server Edge用户权限设置简介
Subversion Server Edge用户权限可分为两种,一种为按用户权限,一种为按组权限设置 1.按用户设置权限 [codeLibrary:/] //对整个代码库 *=r //所有用户 ...
- 【ACM】子串和 - 贪心算法
子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...
- linux使用echo指令向文件写入内容
echo "aaa">test.sh 该指令会覆盖文件原内容,如果文件不存在,则创建 echo "aaa">>test.sh 追加文件内容 h ...
- Lecture--9 Sorting
1/排序算法:冒泡排序bubble sort,插入排序 insertion sort,选择排序 selection sort,快速排序 quick sort,归并排序 merge sort;堆排序 h ...
- 精心整理的SQL语句学习大全
-语 句 功 能 --数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据-数据 ...
- (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...
- Crash日志分析
从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...
- 运用CSS3媒体查询判断iPhoneX、iPhoneXR、iPhoneXS MAX及横竖屏
//iphoneX.iphoneXs @media only screen and (device-width: 375px) and (device-height: 812px) and (-web ...
- app开发,H5+CSS3页面布局小tips
1.inline-block使用后带来的间隔影响 2.竖线的处理 3.ssh公匙 4.星星组件的巧妙用法 5.api.js的$api对象与 安卓原生引擎的api对象,均相当于jQuery的$对象 6. ...