//简易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. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  2. Unity Unity脚本类为什么要尽量避免继承MonoBehaviour类?

  3. SQL判断经纬度在矩形内

    1,将城市地图拆分等距拆分为矩形 数据结构如图: 2.查看高德JS API (点是否在多边形内)核心代码: a=[114.069564,22.545774]; b=[ [114.067595,22.5 ...

  4. Java基础知识——windows系统下安装JDK

    (作者声明:文章引用了其他作者的文章,但因为笔记内容时间过久,已经忘记从哪里摘录下来的了.若无意间侵犯到原作者您的权利,对不起!您可以联系我,我这边会马上进行修改,谢谢!) 1.首先我们需要下载jav ...

  5. 2 cmd中startup显示运行不了显示“不是内部或外部命令”

    解决方案: 1 在C:\Windows\System32中检查cmd.exe是否存在(如果存在的话)(检查cmd.exe是否被误删) 2 在我的电脑——属性——环境变量——在系统变量找到Path编辑前 ...

  6. vscode 常用插件安装

    设置中文语言使用快捷键[Ctrl+Shift+P],弹出的搜索框中输入[configure language],然后选择搜索出来的[Configure Display Language],locale ...

  7. It does not do to dwell on dreams and forget to live.

    It does not do to dwell on dreams and forget to live.不要过于依赖梦想,却忘了生活.

  8. HTTPS与SSL(二)

    CA Ca介绍 电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系 ...

  9. Visual Studio 更改护眼颜色

  10. 美国L1签证申请的常见问题解析

    美国L1是一种允许在美国和中国都有机构的跨国公司从国外的母公司派遣一定层次的经理或专业技术人员去美国分支机构工作的非移民签证.L1签证分两类:美国L1A是跨国公司经理及主管人员签证,L1B是专门技术人 ...