Socket 客户端编程主要步骤如下:

1、socket() 创建一个 Socket

2、connect() 与服务器连接

3、write() 和 read() 进行会话

4、close() 关闭 Socket

Socket 服务器端编程主要步骤如下:

socket() 创建一个 Socket

bind()

listen() 监听

accept() 接收连接的请求

write() 和 read() 进行会话

close() 关闭 Socket

1、客户端和 FTP 服务器建立 Socket 连接。

2、向服务器发送 USER、PASS 命令登录 FTP 服务器。

3、使用 PASV 命令得到服务器监听的端口号,建立数据连接。

4、使用 RETR/STOR 命令下载/上传文件。

5、在下载完毕后断开数据连接并发送 QUIT 命令退出。

当客户端与服务器建立连接后,服务器会返回 220 的响应码和一些欢迎信息。

struct hostent *hp;

struct sockaddr_in server;

memset(&server, 0, sizeof(struct sockaddr_in));/* 初始化socket */

control_sock = socket(AF_INET, SOCK_STREAM, 0);

hp = gethostbyname(server_name);

memcpy(&server.sin_addr,

hp->h_addr, hp->h_length);

server.sin_family = AF_INET;

server.sin_port = htons(port);

/* 连接到服务器端 */

connect(control_sock,(struct sockaddr *)&server, sizeof(server));

/* 客户端接收服务器端的一些欢迎信息 */

read(control_sock, read_buf, read_len);

当客户端发送用户名和密码,服务器验证通过后,会返回 230 的响应码。然后客户端就可以向服务器端发送命令了。

图 2. 客户端登录 FTP 服务器

清单 2. 客户端发送用户名和密码,登入 FTP 服务器

/* 命令 ”USER username\r\n” */

sprintf(send_buf,"USER %s\r\n",username);/*客户端发送用户名到服务器端 */

write(control_sock, send_buf, strlen(send_buf))

;/* 客户端接收服务器的响应码和信息,正常为 ”331 User name okay, need password.” */

read(control_sock, read_buf, read_len);

/* 命令 ”PASS password\r\n” */

sprintf(send_buf,"PASS %s\r\n",password);

/* 客户端发送密码到服务器端 */

write(control_sock, send_buf, strlen(send_buf));

/* 客户端接收服务器的响应码和信息,正常为 ”230 User logged in, proceed.”*/

read(control_sock, read_buf, read_len);

当客户端在下载/上传文件前,要先发送命令让服务器进入被动模式。服务器会打开数据端口并监听。并返回响应码 227 和数据连接的端口号。

sprintf(send_buf,"PASV\r\n");

/* 客户端告诉服务器用被动模式 */

write(control_sock, send_buf, strlen(send_buf));

/*客户端接收服务器的响应码和新开的端口号,* 正常为 ”227 Entering passive mode (

)” */

read(control_sock, read_buf, read_len);

当客户端发送命令下载文件。服务器会返回响应码 150,并向数据连接发送文件内容。

当客户端下载完毕后,发送命令退出服务器,并关闭连接。服务器会返回响应码 200。

首先,服务器准备就绪后返回 220。客户端接收到服务器端返回的响应码后,相继发送“USER username” 和 “PASS password” 命令登录。随后,服务器返回的响应码为 230 开头,说明客户端已经登入了。这时,客户端发送 PASV 命令让服务器进入被动模式。服务器返回如 “227 Entering Passive Mode (127,0,0,1,13,67)”,客户端从中得到端口号,然后连接到服务器的数据端口。接下来,客户端发送下载命令,服务器会返回响应码 150,并从数据端口发送数据。最后,服务器返回 “226 transfer complete”,表明数据传输完成。

需要注意的是,客户端不要一次发送多条命令,例如我们要打开一个目录并且显示这个目录,我们得发送 CWD dirname,PASV,LIST。在发送完 CWD dirname 之后等待响应代码,然后再发送后面一条。当 PASV 返回之后,我们打开另一个 Socket 连接到相关端口上。然后发送 LIST,返回 125 之后在开始接收数据,最后返回 226 表明完成。

在传输多个文件的过程中,需要注意的是每次新的传输都必须重新使用 PASV 获取新的端口号,接收完数据后应该关闭该数据连接,这样服务器才会返回一个 2XX 成功的响应。然后客户端可以继续下一个文件的传输。

上传文件与下载文件相比,登入验证和切换被动模式都如出一辙,只需要改变发送到服务器端的命令,并通过数据连接发送文件内容。

socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二)相关推荐

  1. linux网络通信移植,基于socket API的C/S通信:将Qt程序从Linux移植到windows

    Qt是一个跨平台的GUI开发语言,它是对C++在图形设计方面上的一种扩充.Qt本身包含一系列用来设计图形界面的类,并且对C++原有的类都进行了再次封装.如果你的程序采用Qt的类库,那么源程序在不同平台 ...

  2. Android 开发:通信篇-TCP客户端

    这节教给大家用Android写一个TCP客户端程序 官方文档 Socket - Android SDK | Android Developers 页面 编写连接程序 1.获取控件 EditText e ...

  3. python socket recv超时_python使用多线程编写tcp客户端程序,你还没掌握吗?

    这篇文章主要为大家详细介绍了python使用多线程编写tcp客户端程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在网上浏览的时候发现很多关于此题目的程序都只能接收数据,所以随便找了个程序研究 ...

  4. android socket 代理服务器,Android 使用Socket进行服务器通信

    ·使用Socket进行简单服务器通信 简单服务器端: public class ServerThread implements Runnable{ Socket s=null; BufferedRea ...

  5. android socket 服务,android 创建socket 通信型service

    仿照instaled写的 1.声明   在system/core/rootdir/init.rc中添加: service testlang /system/bin/testlang #       名 ...

  6. linux邮件收发程序流程图,[源码和文档分享]基于C语言和TCP Socket实现的Linux环境下的邮件收发客户端程序...

    一.项目题目及功能 项目题目:设计一个邮件收发客户端程序 功能:设置邮件账户.接收服务器和发送服务器等 接收邮件并显示在一个列表里 编写.发送新邮件 可暂不考虑邮件内容的编码/解码问题 删除邮件 邮件 ...

  7. linux c邮件客户端,[源码和文档分享]基于C语言和TCP Socket实现的Linux环境下的邮件收发客户端程序...

    一.项目题目及功能 项目题目:设计一个邮件收发客户端程序 功能:设置邮件账户.接收服务器和发送服务器等 接收邮件并显示在一个列表里 编写.发送新邮件 可暂不考虑邮件内容的编码/解码问题 删除邮件 邮件 ...

  8. 应用层——使用 Socket 通信实现 FTP 客户端程序

    转自:http://blog.csdn.net/yixijide/article/details/8280263 简介: FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都 ...

  9. 基于socket通信实现Ftp连接

    FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.FTP的目标是提高文件的共享性和可靠高效地传送数据. 在传输文件时,FTP 客户端程序先与服务器建立连接 ...

最新文章

  1. 写了几天的软工课程设计,慢慢了解了点mvc
  2. 5-spark学习笔记-spark集群应用与监控
  3. [BUUCTF-pwn]——test_your_nc
  4. Excel 不能直接打开文件的解决方法
  5. jasmine没有调用fixture.detectChanges就取不到元素的原因
  6. python中的 if __name__ == '__main_'的作用和原理
  7. 1006: 组合的输出(dfs的一种用法)(与排列类似)
  8. float position的测试案例
  9. 机器学习-吴恩达-笔记-3-正则化
  10. 未来,语音识别可能应用于哪些商业化场景?
  11. 哪个服务器支持高并发,IIS Web服务器支持高并发设置方法详解
  12. 选择排序java实现
  13. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(4)
  14. python找重复元素_Python笔记(二)查找重复元素
  15. Ubuntu学习笔记(2)---安装LumaQQ
  16. Logic Pro X for Mac(专业级音频制作软件)
  17. javase2021最强学习线路没有之一
  18. Oracle 监听器无法启动(TNS-12555,TNS-12560,TNS-00525)启动监听器无法打开,报错!
  19. Kali linux下拓实N95外置网卡驱动安装教程
  20. CDR插件开发之Addon插件007 - Addon插件简介和案例演示

热门文章

  1. 2017年免费OA系统选型综合分析
  2. Echarts Y轴单位自动转换
  3. 计算机等级一级wps考试试题,2017年计算机等级考试一级WPS考试试题及答案(二)...
  4. 什么是M1X和M2芯片
  5. 轻轻松松背单词软件测试,MBA联考十佳背单词软件测评报告
  6. 华为防火墙配置(防火墙基础)
  7. 使用百度地图api搜索两点位置、连线、计算距离、ip定位
  8. asciidoc html java_gradle asciidoc 使用
  9. Excel点击两次才能打开
  10. css动画(图片触碰变大)