Linux下的ftp客户端说明文档

发布时间:2006-09-24 00:20:41来源:红联作者:userhq

l 软件功能:

本程序基于linux下的socket函数,利用ftp 协议,实现linux下,连接上ftp server,对文件,整个文件夹的上传和下载,以及浏览ftp server 的内容。

l 使用说明:

// usage :

// connect : ftp.out 10.10.10.10 21

// download file: get filename

// upload file : put filename

// download directory: d filename

// upload directory : u filename

// list : list

// list : dir

// quit : quit

l 函数主体说明:

enum COMMAND getcmd(struct ftp_client *);// get user input

int getline(char *); // get a line of input

int getport(char *); // get port of data socket

int pasv( struct ftp_client *); // enter pasive mode in ftp

int list( struct ftp_client *); // list file in server

int get( struct ftp_client *); // download file

int cwd( struct ftp_client *); // change directory of ftp server

int get_d(struct ftp_client *); // download dirctory

int print_list( struct ftp_client *); // print file name in a list file

int get_file ( struct ftp_client *); // downlaod file

int analyse ( struct ftp_client *); // got name of the file and directory

l ftp协议说明:

文件传输协议(File Transfer Protocol, FTP)

1. 介绍

FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户 透明和可靠高效地传送数据。

2. 数据传输功能

数据连接只传输数据,控制连接传送命令和响应。

3. 传输模式

有三种传输模式:一种将数据格式化并考虑重新开始过程;一种压缩数据;一种 是不经过处理(少量处理)传送。

4. 流模式

数据以字节流的形式传送。使用的表示类型没有限制,允许记录结构。

5. 访问控制命令

下列命令指定访问控制标记(命令码在括号内):

用户名(USER)

参数是标记用户的Telnet串。

口令(PASS)

参数是标记用户口令的Telnet串。此命令紧跟USER命令,在某些站点它是完成 访问 控制不可缺少的一步。

改变工作目录(CWD)

此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或帐户信 息。传 输参数也不变。参数一般是目录名或与系统相关的文件集合。

6.传输参数命令

所有数据传输参数有默认值。服务器必须记录下默认值,在FTP服务请求后,可 以以 任何顺序发送。下面命令传送参数:

数据端口(PORT)

参数是要使用的数据连接端口,通常情况下对此不需要命令响应。如果使用此命 令时,要发送32位的IP地址和16位的TCP端口号。上面的信息以8位为一组, 逗号间隔十进制传输,如下例:

PORT h1,h2,h3,h4,p1,p2

其中h1是IP地址的最高8位。

7.被动(PASV)

此命令要求服务器DTP在指定的数据端口侦听,进入被动接收请求的状态,参数 是主 机和端口地址。

8.表示类型(TYPE)

参数指定表示类型。

9. FTP服务命令

获得文件(RETR)

此命令使服务器DTP传送指定路径内的文件复本到服务器或用户DTP。这边服 务器上文件的状态和内容不受影响。

保存(STOR)

此命令使服务器DTP接收数据连接上传送过来的数据,并将数据保存在服务 器的文件中。如果文件已存在,原文件将被覆盖。如果文件不存在,则新建 文件。

创建目录(MKD)

此命令在指定路径下创建新目录。

打印工作目录(PWD)

在响应是返回当前工作目录。

系统(SYST)

用于确定服务器上运行的操作系统。

10.FTP应答

1yz 确定预备应答

请求的操作正在被初始化;在进入下一个命令前等待另外的应答。这类响应 用于说明命令被接受,在实现中如何同步监视有困难,用户进程现在可以关 注数据连接了。服务器FTP进程对第个命令几乎都返回1yz响应。

2yz 确定完成应答

要求的操作已经完成,可以执行新命令。

3yz 确定中间应答

命令已接受,但要求的操作被停止,停止接收更新的信息。

4yz 暂时拒绝完成应答

未接受命令,要求的操作未执行,但错误是临时的,过一会儿可以再次发送 消息。用户应该返回命令序列的开始。这个暂时可是不好确定,此命令的意 思就是让用户进程再次尝试使用此命令。

5yz 永远拒绝完成应答

它与暂时拒绝完成应答的区别就在于错误条件是一时半会不会消失。

x0z 格式错误;

x1z 此类应答是为了请求信息的;

x2z 此类应答是关于控制和数据连接的;

x3z 关于认证和帐户登录过程;

x4z 未使用;

x5z 此类应答是关于文件系统的;

下面根据数字顺序列出各个应答码及其意义:

125

数据连接已打开,准备传送

150

文件状态良好,打开数据连接

200

命令成功

202

命令未实现

215

名字系统类型

220

对新用户服务准备好

221

服务关闭控制连接,可以退出登录

225

数据连接打开,无传输正在进行

226

关闭数据连接,请求的文件操作成功

227

进入被动模式

230

用户登录

250

请求的文件操作完成

331

用户名正确,需要口令

332

登录时需要帐户信息

421

不能提供服务,关闭控制连接

425

不能打开数据连接

426

关闭连接,中止传输

450

请求的文件操作未执行

451

中止请求的操作:有本地错误

500

格式错误,命令不可识别

501

参数语法错误

502

命令未实现

503

命令顺序错误

530

未登录

550

未执行请求的操作

551

请求操作中止:页类型未知

552

请求的文件操作中止,存储分配溢出

553

未执行请求的操作:文件名不合法

l 技术难点分析:

1, list命令之后,对list_ftp文件名的处理,以下是实现的算法:

这部分的内容由analyse函数实现:

int analyse ( struct ftp_client *p)

{

打开文件

while(文件没有结束)

{

获取一个字符

标记是否是文件

跳过8个字符串

把剩下的全读进来作为名字保存

如果是文件

压到栈中

创建这个文件

}

}

2, 下载目录时的堆栈操作。

int get_local_file ( struct ftp_client *p) // upload all the file in this level and push directory to stack

{

先把p->path备份

strcpy(recover,p->path);

while(p->path[n++]); // n is current path length

算出路径的长度,下面用malloc时用

analyse_local(p); // name is store in p->buf

分析当前层的文件结构,下载文件,压栈文件夹

while(p->tell >0) 当栈里还有文件夹时

{

如果是文件

if ( p->file[p->tell-1] == 0 ) // == file why don't tell the file name ? file name

{

下载文件

}

如果是文件夹

else if (p->file[p->tell-1] == 1 ) // == directory

{

把文件夹一个个压到栈里

}

p->tell--; // one file in current directory is processed

}

return 1;

}

l 进一步的改进

1. 应该完善出错处理机制,网络常常会出错,那么就不能假设一切传输都是按照预期的那样,目前这个程序有报错的处理,但是出错后,有一些情况是报错后程序中止,而不是回到主循环里,那么又需要重新登陆,麻烦。协议端口可以用非阻塞式传输,用一个常量try_time控制检测次数。这样可以使这个程序用起来更方便。

2. 可以考虑实现当前本地目录可以改变的功能。

3. 可以考虑实现ftp里的更多功能,比如删除server上的文件等。

4. 压栈操作里用了常量buffer,有点浪费内存,可以改成malloc来动态分配名字的长度和buffer的长度。虽然这样写容易出错。

5. 可以考虑移植到windows下,只要把socket部分换成winsock就基本上可以了,还有一个wsastartup函数

6. 可以考虑移植到图形界面,用qt或gtk编程。

l 心得:

1. 出错的重点和排错的重点还是边界处理,用gdb或者kdevelop可以debug,但是没有vc方便,可以把主要算法拷贝到vc里去排除错误,有那个自动添加变量功能,还有快捷键,可以提高不少效率。

2. 数据结构还是算法的关键,堆栈处理又是数据结构中很重要的部分,要尽量熟练应用。还有二叉树的遍历等都该复习复习了。

3. Linux下编程windows下编程有所不同,没有mfc这种大的构架可以利用,但是也有很多小命令,可以尽量利用shell里的函数和功能,例如ls之类的,还有rm,mkdir等等,用system调用或exec函数都可以。

4. socket网络编程的调试比较麻烦,也没什么好办法,我的经验是用大量的printf语句把重要的变量打出来,然后看看屏幕就可以跟踪分析其中的问题。用kdevelop之类的调试的话也不错,就是不能自动添加变量,每次调都得重新输一遍。

5. 编程还是要考虑模块化,或者对象化,以利于进一步的移植。

linux 影院 ftp客户端20端口号,Linux下的ftp客户端说明文档相关推荐

  1. Linux使用小于1024的端口号,Linux中如何让普通用户使用小于1024的端口

    在Linux系统中,一般情况下,小于1024的端口是不对没有root的Linux普通用户开放的.但是还是有一些技巧能够让没有root的用户使用小于1024的端口的.本文就来介绍一下Linux中如何让普 ...

  2. Linux查看服务器开放的端口号/Linux查看服务器开放了哪些端口

    Linux查看服务器开放的端口号 - 百度文库 https://wenku.baidu.com/view/73638115ed06eff9aef8941ea76e58fafab04596.html l ...

  3. linux查看进程号、端口号

    进程ID是由操作系统内核进行分配和管理的,而端口号是由通讯协议内核分配并进行管理的. Linux查看进程号.端口号 Linux 查看端口占用情况 linux命令: ps.grep.kill 1.已知程 ...

  4. linux命令查询端口号,linux查询端口号(linux查看端口的命令)

    linux查询端口号(linux查看端口的命令) 2020-07-24 11:55:46 共10个回答 1.打开任务管理器(在桌面最下面的"任务栏"右击鼠标).2.在任务管理器界面 ...

  5. linux tcp客户端端口号,Linux网络编程--服务器客户端(TCP实现)

    Linux下的一个服务器客户端的小程序,基于TCP的实现:服务器可以同时接受多个客户的接入,通过子进程处理客户请求,下面的例子中,服务器只将客户的IP和端口以及发送的信息显示,然后原样的将客户发送的信 ...

  6. Linux 查看服务器开放的端口号

    在讨论这个问题前,我们先来了解一下物理端口.逻辑端口.端口号等计算机概念. 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL M ...

  7. linux查看开了哪些端口号_Linux 查看服务器开放的端口号

    在讨论这个问题前,我们先来了解一下物理端口.逻辑端口.端口号等计算机概念. 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL M ...

  8. linux查看开了哪些端口号_Linux如何查看服务器开放的端口号

    概述 平时我们玩linux的时候有时需要看下服务器是不是开放了一些端口号,然后看新的端口会不会冲突之类,讲查看服务器开放端口号之前,先了解一下物理端口.逻辑端口.端口号等计算机概念. 01 端口相关概 ...

  9. linux修改ssh登陆端口号,Linux 6 修改ssh默认远程端口号的操作步骤

    linux 默认的ssh远程端口是22,有时默认端口会遭到别有用心的人们扫描或攻击,为了时我们的系统更加安全那就需要修改远程端口号 操作步骤: 1.修改ssh_config配置文件 vim /etc/ ...

最新文章

  1. TCP连接的建立和终止
  2. 开发日记-20190706 关键词 读书笔记 《Perl语言入门》Day 3
  3. 成功解决Git Bash运行脚本命令下载文件到默认C盘路径的问题
  4. C语言课后习题(37)
  5. 前台性能和服务器性能是什么,前端性能优化指南[2]--什么是Web性能?
  6. nodejs项目安装ant design
  7. 怎么就没发现华为Mate20 pro有这么多神奇功能!这波黑科技盘它!
  8. 第006讲 多媒体页面 标签汇总
  9. AppUse学习笔记
  10. 线材下料优化python算法_深度学习中的优化算法(Optimizer)理解与python实现
  11. 同城交友小程序项目功能方案介绍
  12. 59——EXPLORING THE LIMITS OF DATA AUGMENTATION FORRETINAL VESSEL SEGMENTATION
  13. 软件测试的六大测试质量标准
  14. power BI爬取网页数据方法
  15. Symbian开发——Symbian开发知识(转)
  16. 高数 07.04 多元复合函数的求导法则
  17. Office Word如何设置页码(MacOS中为例)
  18. 台式计算机启动时 每次按f1,电脑开机每次都要按f1怎么办|电脑开机要按f1的解决方法...
  19. 关于视频字幕(有无外挂字幕)的提取死磕一天的总结
  20. EduCoder-Web程序设计基础-html5—表格高级样式的设置-第5关:表格的综合案例

热门文章

  1. 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
  2. Python实现邮件发送
  3. 数据解析1:XML解析(1)
  4. 【CCNA考试】2010-06-14-河北-936(PASS)
  5. 841. 钥匙和房间
  6. Initializer Lists
  7. 给出如下公式的python表达式7+9i+2xcos66_这100道练习,带你玩转Numpy
  8. 我用Python写了一个邮箱脚本发给班花,没想到事情闹大了...
  9. 水箱建模最小二乘法_北师大版小学数学下册五年级第四单元长方体(二)整理复习电子课本练习同步教学视频...
  10. 硬盘底座linux,微客智品 篇五十二:机械硬盘如何安放?用奥睿科单盘位移动硬盘底座助力新玩法...