既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
- 向服务器发送 USER、PASS 命令登录 FTP 服务器。
- 使用 PASV 命令得到服务器监听的端口号,建立数据连接。
- 使用 RETR/STOR 命令下载/上传文件。
- 在下载完毕后断开数据连接并发送 QUIT 命令退出。
本例中使用的 FTP 服务器为 filezilla。在整个交互的过程中,控制连接始终处于连接的状态,数据连接在每传输一个文件时先打开,后关闭。
客户端和 FTP 服务器建立 Socket 连接
当客户端与服务器建立连接后,服务器会返回 220 的响应码和一些欢迎信息。
图 1. 客户端连接到服务器端
清单 1. 客户端连接到 FTP 服务器,接收欢迎信息
SOCKET control_sock;
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);
客户端登录 FTP 服务器
当客户端发送用户名和密码,服务器验证通过后,会返回 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));
/* 客户端接收服务器的响应码和信息,正