已经好久没有写过博客进行分享了。具体原因,在以后说。

  这几天在了解FTP协议,准备任务是写一个FTP客户端程序。直接上干货了。

0.了解FTP作用

  就是一个提供一个文件的共享协议。

1.了解FTP协议

  FTP有指令和响应码。FTP 控制帧即指 TELNET 交换信息,包含 TELNET 命令和选项。然而,大多数 FTP 控制帧是简单的 ASCII 文本,可以分为 FTP 命令或 FTP 消息。 FTP 消息是对 FTP 命令的响应,它由带有解释文本的应答代码构成。

  像这种利用交换信息来进行简单的控制,这种协议,还真的很好玩的说。 命令与响应码部分信息如下

  

  

2. 安装一个FTP服务器

  我们先安装一个FTP服务器,用于测试,这里是用FileZilla Server作为FTP服务器。

  启动后,增加一个用户user/user

3.FTP客户端源代码讲解

  下面这个是FTPAPI.h文件

  1. 1 #ifndef FTPAPI_H_INCLUDED
  2. 2 #define FTPAPI_H_INCLUDED
  3. 3
  4. 4 #include <stdio.h>
  5. 5 #include <winsock2.h>
  6. 6
  7. 7 SOCKET socket_connect(char *host, int port);
  8. 8 SOCKET connect_server(char *host, int port);
  9. 9 int ftp_sendcmd_re(SOCKET sock, char *cmd, char *re_buf, ssize_t *len);
  10. 10 int ftp_sendcmd(SOCKET sock, char *cmd);
  11. 11 int login_server(SOCKET sock, char *user, char *pwd);
  12. 12 void socket_close(int c_sock);
  13. 13
  14. 14
  15. 15 /**********可用命令*********/
  16. 16 SOCKET ftp_connect(char *host, int port, char *user, char *pwd); //连接到服务器
  17. 17 int ftp_quit(SOCKET sock); //断开连接
  18. 18 int ftp_type(SOCKET sock, char mode); //设置FTP传输类型
  19. 19 int ftp_cwd(SOCKET sock, char *path); //更改工作目录
  20. 20 int ftp_cdup(SOCKET sock); //回到上级目录
  21. 21 int ftp_mkd(SOCKET sock, char *path); //创建目录
  22. 22 SOCKET ftp_pasv_connect(SOCKET c_sock); //连接到PASV接口
  23. 23 int ftp_list(SOCKET c_sock, char *path, char **data, int *data_len); //列出FTP工作空间的所有目录
  24. 24 int ftp_deletefolder(SOCKET sock, char *path); //删除目录
  25. 25 int ftp_deletefile(SOCKET sock, char *filename); //删除文件
  26. 26 int ftp_renamefile(SOCKET sock, char *s, char *d); //修改文件/目录&移动文件/目录
  27. 27 int ftp_server2local(SOCKET c_sock, char *s, char *d, int * size); //从服务器复制文件到本地 RETR
  28. 28 int ftp_local2server(SOCKET c_sock, char *s, char *d, int * size); //从本地复制文件到服务器 STOR
  29. 29 int ftp_recv(SOCKET sock, char *re_buf, ssize_t *len); //获取响应码
  30. 30
  31. 31
  32. 32 #endif // FTPAPI_H_INCLUDED

  下面这个是FTPResponseCode.h 文件 是对应答码简单的描述

 

  下面这些是FTPAPI.cpp文件的函数代码

  创建一个socket连接并返回socket套接字 socket_connect

 

  连接到一个ftp服务器 connect_server

 

  send发送命令,并返回recv结果 ftp_sendcmd_re

 

  send发送命令 ftp_sendcmd

 

  登录FTP服务器 login_server

 

  winsock使用后,要调用WSACleanup函数关闭网络设备 socket_close

 

  连接到FTP服务器 ftp_connect

 

  断开FTP服务器 ftp_quit

 

  设置FTP传输类型 A:ascii I:Binary  ftp_type

 

  更改工作目录 ftp_cwd

 

  回到上级目录 ftp_cdup

 

  创建目录 ftp_mkd

 

  连接到PASV接口 ftp_pasv_connect

 

  列出FTP工作空间的所有目录 ftp_list

 

  删除目录 ftp_deletefolder

 

  删除文件 ftp_deletefile

 

  修改文件名&移动目录 ftp_renamefile

 

  从服务器复制文件到本地 RETR  ftp_server2local

 

  从本地复制文件到服务器 STOR ftp_local2server

 

  获取一行响应码 ftp_recv

 

4.测试ftp客户端

  下载文件到本地

  1. 1 SOCKET s = ftp_connect("127.0.0.1",21,"user","user"); //登录到FTP服务器
  2. 2 int ret = ftp_server2local(s,"user/user.zip","bin.zip",&size); //在FTP服务器获取文件
  3. 3 ftp_quit(s); //退出FTP服务器

  上传文件到服务器

  1. 1 SOCKET s = ftp_connect("127.0.0.1",21,"user","user"); //登录到FTP服务器
  2. 2 int ret = ftp_local2server(s,"user/user.zip","bin.zip",&size); //发送文件到FTP服务器
  3. 3 ftp_quit(s); //退出FTP服务器

  下面这个是服务器的日志信息

  

  下面这个是程序打印的调试信息

  

5.后话

  到这里这个简单的ftp库就可以实现绝大部分的客户端功能了,但是这里面有一个问题,就是ftp是明文传输用户名/密码的,如果ftp上的文件比较重要的话,那么就有点问题了。当然这个不是本次的关注点,本次主要是了解ftp协议,还有从代码中了解这种交换控制命令的方法是一种很不错的技术手段,虽然这种方法已经是好多年前的,不安全,也过时了。但还是有可学的地方。

6.附录

  下面这个附录是利用wireshark进行本地网络抓包测试。

1、抓包,要看部署点,在路由器、交换机等设备上做端口镜像、或分光口,或是接HUB、TAP等设备就可以直接获得通过这些口的报文。
2、抓包,也可在以局域网部署相关的网管软件或黑客工具(比如cain),可以用arp骗方式,让你的数据先发送到监控机上,然后再转发走。。这样你的数据就。。

建议:
1、建议在电脑上打开ARP防护功能
2、在使用中尽量使用加密传输的工具,比如SSH、SSL、QQ一类的东西。可避免一些危害.

  注意wireshark是不能抓取本地回环地址的数据包的,所以我以远程ftp服务器进行测试

   

  这里是通过浏览器进行连接的。wireshark 1.12.4 从上面可以看到的信息 29-44这些表示了,浏览器一开始使用匿名进行登录,发现登录不上,所以请求用户名登录在81 82 84 85这4行中我们可以分析到,我是输入用户名user 密码user进行登录的,第106行表示用户名/密码错误。 如果是230 Login in 就表示成功登录了。如果我们捉到了这些信息,那么我们就可以进行登录了。这样就不安全了。既然ftp这么不安全为什么那么多地方用到ftp共享文件。这个就要说到ftp的作用了,ftp作用本来就是共享文件,所以安全性就不是很重要了。 至于加密方式以后再讲。

  (开发环境mignw 编译的时候要加入libws2_32.a 这个库, 编译命令 g++ ftpapi.cpp -c -o ftpapi.o -lws2_32)

  参考资料

  TanHao的 THFTPAPI.c 文件 http://www.tanhao.me

  文件下载 ftpapi.zip http://files.cnblogs.com/files/wunaozai/ftpapi20150512.zip

http://www.cnblogs.com/wunaozai/p/4494536.html

Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)的更多相关文章

  1. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

  2. Socket网络编程--FTP客户端(2)(Windows)

    上一篇FTP客户端讲到如果制作一个简单的FTP客户端,功能实现了,但是后面我们发现了问题,就是FTP是使用明文进行操作的.对于普通情况来说就无所谓了.但有时候要安全的一点的话,就应该使用FTP的安全版 ...

  3. Socket网络编程--FTP客户端(1)(Windows)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...

  4. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

  5. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  6. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  7. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  8. Python Socket 网络编程 (客户端的编程)

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  9. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

随机推荐

  1. NET Core,Ubuntu运行

    NET Core,如何开发跨平台的应用并部署至Ubuntu运行 之前写了一篇博文宣布Rabbit Rpc跨平台了“拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc”,在过程中尝试了如 ...

  2. VB6.0快捷键大全(转)

    窗体设置,控件布局时用: alt+v+x可以快速显示出工具框 Alt+P+N 引用 ctrl+左右键头可以移动控件 shift+左右键头调整控件大小 F7   切换到编辑窗口 Shift+f7 切换代 ...

  3. 2_Cat Years

    2 // // ViewController.swift // Cat Years // // Created by ZC on 16/1/6. // Copyright © 2016年 ZC. Al ...

  4. C++模板:欧拉函数

    单个欧拉函数 int eular(int n){ int ret=1,i; for(i=2;i*i<=n;i++) if(n%i==0){ n/=i,ret*=i-1; while(n%i==0 ...

  5. Effective C++ 第二版 10) 写operator delete

    条款10 写了operator new就要同时写operator delete 写operator new和operator delete是为了提高效率; default的operator new和o ...

  6. [置顶] SQL日期类型

    在做机房收费系统的时候,上下机,我觉得是我在整个系统中遇到最棘手的问题了,现在就给大家,分享一下,我是怎样解决的. SQL中有3中数据类型是关于日期的,每一种的用法是不同的,当你用错了,就会出现下面这 ...

  7. HDU - 5009 Paint Pearls(dp+优化双向链表)

    Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He ...

  8. SharePoint 2010 BCS - 简单实例(一)数据源加入

    博客地址 http://blog.csdn.net/foxdave 本篇基于SharePoint 2010 Foundation. 我的数据库中有一个病人信息表Patient,如今我就想把这个表中的数 ...

  9. ASP.NET 母版页和内容页的加载顺序

    Master 模板页Content 内容页如果希望Master页面的数据传给Content页面,请Init如果希望Content页面的数据传给Master页面,请重载Load具体细节不多说了,看下面页 ...

  10. DevExpress ASP.NET 使用经验谈(6)-ASPxGridView属性设置与CRUD界面优化

    上一节中,我们通过简单的配置,通过ASPxGridView控件的使用,完成了对数据库表的CRUD操作. 这样的界面展现,功能是达到了,但是操作体验上,还是有所欠缺的. 图一 默认生成的列表界面 图二 ...