//简易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客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能的更多相关文章

  1. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹

    摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...

  2. win7下利用ftp实现华为路由器的配置文件上传和下载

    win7下利用ftp实现华为路由器的配置文件上传和下载 1.  Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...

  3. C#通过FTP账号上传、修改、删除文件 FTPClient

    下面类文件中,主要做的工作是:从ftp服务器上下载文件把本地文件替换.添加.或删除功能,在替换本地文件时会先备份一下本地的文件,若整个操作都完成了就会发出commit命令,表示全部替换成功.若中间操作 ...

  4. Java 实现ftp 文件上传、下载和删除

    本文利用apache ftp工具实现文件的上传下载和删除.具体如下: 1.下载相应的jar包 commons-net-1.4.1.jar 2.实现代码如下: public class FtpUtils ...

  5. C# ftp 上传、下载、删除

    public class FtpHelper { public static readonly FtpHelper Instance = new FtpHelper(); /// <summar ...

  6. java上传、下载、删除ftp文件

    一共三个类,一个工具类Ftputil.,一个实体类Kmconfig.一个测试类Test 下载地址:http://download.csdn.net/detail/myfmyfmyfmyf/669710 ...

  7. c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类

    有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...

  8. webDAV服务的开启以及客户端的上传、下载、删除、新建文件夾、列表的代码(C#)

    windows server 2003开启webDAV服务 1. 启动“IIS管理器”选择“WEB服务扩展”,选择“WEBDAV”的允许按钮启动WEBDAV功能 2.建立一个虚拟目录,对应到一个本地目 ...

  9. PHPstorm设置连接FTP,进行文件上传、下载、比较

                                                 内容转载自:http://www.cnblogs.com/jikey/p/3486621.html   如何在 ...

随机推荐

  1. java insert mysql 中文乱码

    jdbc:mysql://192.168.1.77:3306/db360?useUnicode=true&characterEncoding=UTF-8 drop database if ex ...

  2. 一,JVM 自带命令行工具之JPS

    jps:虚拟机进程状况工具 可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main class,class()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID. jps命令格式: jps ...

  3. C#中常用的字符串验证

    using System; using System.Text.RegularExpressions; namespace Util { public static class @string { # ...

  4. 基于screen.width的伪响应式开发

    一.站在用户的角度看问题 一个用户,访问一个web页面的真实场景是怎样的呢? 下面是某用户访问某站点的一个场景: 1. 小明打开了自己的电脑,访问了鑫空间-鑫生活: 2. 小明体内洪荒之力无法控制,疯 ...

  5. 使用FusionCharts创建可更新数据的JavaScript图表

    先创建一个简单的图表,然后改变它的数据(请参见下面的代码).图表最初据显示8月份的销售数据,当用户点击按钮时改为显示9月份的销售数据.每个月都有单独的XML文件,代码如下: <html> ...

  6. SpringBoot的优缺点

    优点: 1.快速构建项目 2.对主流开发框架的无配置继承 3.项目可独立运行,无须外部依赖Servlet容器 4.提高运行时的应用监控 5.极大地提高了开发.部署效率 6.与云计算的天然集成 缺点: ...

  7. Nodejs入门边读边想边记(-)

    Node入门>>一本全面的Node.js教程网站地址:http://www.nodebeginner.org/index-zh-cn.html 本文记录我在阅读上面这个网站的过程中得到的一 ...

  8. Riverbed SteelHead 9.5.0

    平台: scientific linux release 6.5 类型: 虚拟机镜像 软件包: riverbed steelhead 9.5.0 basic software Enterprise i ...

  9. CSS第二节

    div做页面布局的建议 把整个网页从上到下分成若干块(一般分三块:头,中间,尾部),每一块都按下面的思路 先写第一层,可以设置背景色,或者高度和垂直居中(line-height保证内容不超出高度),不 ...

  10. IFEO 映像文件劫持

    “映像劫持”,也被称为“IFEO”(Image File Execution Options) 映像劫持的根本就是被恶意篡改了注册表HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...