我正在编写客户端 FTP 程序,到目前为止,在成功连接后,服务器将以扩展被动模式运行。使用从 EPSV
命令返回的端口号,我可以像这样创建客户端套接字:
void create_data_channel() {
if ((data_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Cannot create client socket for data connection :(");
exit(1);
}
data_server_addr.sin_family = AF_INET;
data_server_addr.sin_port = htons(port);
data_server_addr.sin_addr = *((struct in_addr *)ftp_server->h_addr);
bzero(&(data_server_addr.sin_zero),8);
// Connect to the ftp server at given port for data connection
if (connect(data_sock, (struct sockaddr *)&data_server_addr,
sizeof(struct sockaddr)) == -1) {
perror("Cannot connect to the ftp server for data connection :(");
exit(1);
}
}
现在,每当我想发送涉及数据通道的命令时(例如 LIST
),我可以先使用上面的方法打开一个新套接字,然后从/获取/发送我需要的任何数据到 ftp 服务器。然后,我使用 close(data_sock)
关闭数据连接。
这适用于第一个 LIST
命令。但是,如果我尝试运行两个或多个 LIST
命令,程序将失败并显示错误消息“无法连接到 ftp 服务器进行数据连接 :(”。这是为什么?我想念这里?
最佳答案
通常,FTP 服务器不接受到同一个动态端口的多个连接。因此,PASV
或 EPSV
命令需要在每次数据传输之前完成,以便服务器创建一个新的监听套接字并将其端口号返回给客户端。
关于c - TCP 连接 : Recreating a socket that has been closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605489/