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