c - TCP 连接 : Recreating a socket that has been closed

标签 c sockets tcp ftp

我正在编写客户端 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 服务器不接受到同一个动态端口的多个连接。因此,PASVEPSV 命令需要在每次数据传输之前完成,以便服务器创建一个新的监听套接字并将其端口号返回给客户端。

关于c - TCP 连接 : Recreating a socket that has been closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605489/

相关文章:

c++ - 为什么 UNIX 文件描述符不是由它们自己的类型实现的,尤其是在 C++ 中?

c++ - 关于预处理过程中MACROS的扩展

c - 访问/修改结构中的字符串数组

c++ - 无法从 getsockname 获取本地主机 IP 地址?

python - 如何在python中使用基于TCP的HTTP下载图像?

linux - 使用linux路由器修改H323 tcp数据包

spring - 如何知道有多少连接正在连接SpringBoot网站?

c - sscanf 有多个空格?

c# - TcpClient.Close() 仅适用于 Thread.Sleep()

c++ - LibVLC 流式传输到内存 p_audio_data