使用 Socket 通信实现 FTP 客户端程序

2015-01-18 09:59:35|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

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

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

客户端通过被动模式向服务器上传文件

当客户端发送命令上传文件,服务器会从数据连接接收文件。

6. 客户端连接到 FTP 服务器的数据端口并上传文件

客户端连接到 FTP 服务器的数据端口并上传文件

客户端通过主动模式向服务器上传文件

到目前为止,本文介绍的都是客户端用被动模式进行文件的上传和下载。下面将介绍客户端用主动模式下载文件。

7. 用主动模式从 FTP 服务器下载文件

用主动模式从 FTP 服务器下载文件

清单 7. 用主动模式从 FTP 服务器下载文件的示例 C 程序

//... ...

SOCKET data_sock;

data_sock = socket(AF_INET, SOCK_STREAM, 0);

struct  sockaddr_in  name;

name.sin_family = AF_INET;

name.sin_addr.s_addr = htons(INADDR_ANY);

server_port = p1*256+p2;

length = sizeof(name);

name.sin_port = htons(server_port);

bind(server_sock, (struct sockaddr *)&name, length);

struct  sockaddr_in client_name;

length = sizeof(client_name);



/* 客户端开始监听端口p1*256+p2 */

listen(server_sock, 64);


/* 命令 ”PORT 
” */

sprintf(send_buf,"PORT 1287,0,0,1,%d,%d
", p1, p2);

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

/* 客户端接收服务器的响应码和信息,正常为 ”200 Port command successful” */

read(control_sock, read_buf, read_len);


sprintf(send_buf,"RETR filename.txt
");

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

/* 客户端接收服务器的响应码和信息,正常为 ”150 Opening data channel for file transfer.” */

read(control_sock, read_buf, read_len);


/* ftp客户端接受服务器端的连接请求 */

data_sock = accept(server_sock,(struct sockaddr *)&client_name, &length);

//... ...


file_handle = open(disk_name, ROFLAGS, RWXALL);

for( ; ; ) {

//... ...

read(data_sock, read_buf, read_len);

write(file_handle, read_buf, read_len);

//... ...    

}

close(file_handle);
发表评论0条 】
网友评论(共?条评论)..
使用 Socket 通信实现 FTP 客户端程序