TCP-соединение: воссоздание сокета, который был закрыт - PullRequest
0 голосов
/ 02 октября 2018

Я пишу клиентскую 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-серверу для передачи данных :(». Почему это так? Чего мне здесь не хватает?

1 Ответ

0 голосов
/ 02 октября 2018

Обычно FTP-сервер не принимает несколько подключений к одному динамическому порту.Поэтому команды PASV или EPSV необходимо выполнять перед каждой передачей данных, чтобы сервер создал новый прослушивающий сокет и вернул свой номер порта клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...