FTP, пассивный режим. Не удается назначить запрошенный адрес

Я не могу подключиться к порту данных. Я могу подключиться к 21 командному порту, отправить имя пользователя и пароль. Тогда я отправляю PASV\r\n, Я получаю ответ и вычисляю порт данных A * 256 + B = new_port, Проблема в том, что я не могу подключиться к этому порту. Для создания сокета я использую createRemoteConnection() функция. Это используется дважды, в первый раз для командного порта, и я прохожу там new_port и тогда я позвоню еще раз. Не могли бы вы мне помочь, пожалуйста? Спасибо.

PASV
227 Entering Passive Mode (80,251,0,59,158,36).
A: 158
B: 36
Port: 40484
Creating socket...
Socket created
connect failed. Error: Can't assign requested address

-

int createRemoteConnection(Arguments &arguments,int cmd) {
int sock;
struct sockaddr_in server;
if (DEBUG) {
    puts("Creating socket...");
}

//Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
    fputs("Could not create socket.\n",stderr);
    exit(1);
}

if (DEBUG) {
    puts("Socket created");
}

char ip[100];
struct hostent *he;
struct in_addr **addr_list;

if ((he = gethostbyname(arguments.hostname)) == NULL) {
    herror("gethostbyname");
    exit(1);
}

addr_list = (struct in_addr **) he->h_addr_list;

for (int i = 0; addr_list[i] != NULL; i++) {
    strcpy(ip, inet_ntoa(*addr_list[i]));
}

server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(cmd);

//Connect to remote server
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
{
    perror("connect failed. Error");
    exit(1);
}

if (DEBUG) {
    puts("Connected\n");
}

return sock;
}

1 ответ

Вы не можете подключиться сразу после PASV команда.

Вы должны позвонить STOR, REST, LIST, MLSD или аналогичная команда в первую очередь.

Другие вопросы по тегам