Простой FTP-клиент C++ ⇐ C++
-
Гость
Простой FTP-клиент C++
Я пытаюсь создать простой FTP-клиент на C/C++, который будет выполнять простые операции (подключение, получение файла). Пока что у меня работает соединение и вход в систему. Я подключаюсь через сокеты к порту 21, как любой обычный FTP-клиент. У меня возникла проблема с подключением к порту, указанному при вводе команды PASV. Я получаю сообщение, анализирую его, затем вычисляю порт на основе сообщения воспроизведения при вводе PASV.
227 Вход в пассивный режим (a1, a2, a3, a4, p1, p2) Порт данных = (p1 * 256) + p2 После того как у меня есть порт, я пытаюсь создать другой сокет и подключиться к нему таким же образом. Вот в чем мои проблемы. Мой код опубликован ниже. Я не знаю, нужно ли мне снова получать адрес сервера таким же способом. Я не получаю ответ от сервера (я не знаю, должен ли я его получить на самом деле). Пожалуйста, задавайте любые вопросы или предложения, спасибо.
const int FTP_PORT = 21; // Порт сервера константный INT РАЗМЕР = 1024; // Размер буферов символ полученияBuff[РАЗМЕР]; // Буфер для отправки на сервер символ sendBuff[РАЗМЕР]; // Буфер для получения с сервера char pasvBuff[] = "pasv"; // Буфер, чтобы увидеть, была ли введена команда PASV char quitBuff[] = "ВЫЙТИ"; // Буфер, чтобы увидеть, была ли введена команда QUIT символ pasvMessage[100]; // Строка для информации PASV int main(int argc, char *argv[]) { длина int = 0, я = 0; int a1, a2, a3, a4, p1, p2, порт данных; //Информация PASV /* Получить имя сервера от пользователя */ если (арг!= 2) { cerr h_length); servAdr.sin_port = htons(dataPort); // Используем FTP-порт /* Создаем сокет для подключения к FTP-серверу */ интервал данныхSock; // Сокет данных в клиенте если ((dataSock = сокет(PF_INET, SOCK_STREAM, 0)) < 0) { perror("Клиент: сгенерировать ошибку"); возврат 3; } /* Подключаемся к FTP-серверу через порт данных */ if (connect(dataSock, (struct sockaddr *)&servAdr, sizeof(servAdr)) < 0) { perror("Клиент: ошибка подключения"); возврат 4; } read(dataSock, полученияBuff, sizeof(receiveBuff) - 1); write(fileno(stdout),receiveBuff, sizeof(receiveBuff) - 1); } } while (strncmp(sendBuff, quitBuff, 4) != 0); // Продолжаем, пока не будет введена команда QUIT закрыть (оригSock); вернуть 0; }
Я пытаюсь создать простой FTP-клиент на C/C++, который будет выполнять простые операции (подключение, получение файла). Пока что у меня работает соединение и вход в систему. Я подключаюсь через сокеты к порту 21, как любой обычный FTP-клиент. У меня возникла проблема с подключением к порту, указанному при вводе команды PASV. Я получаю сообщение, анализирую его, затем вычисляю порт на основе сообщения воспроизведения при вводе PASV.
227 Вход в пассивный режим (a1, a2, a3, a4, p1, p2) Порт данных = (p1 * 256) + p2 После того как у меня есть порт, я пытаюсь создать другой сокет и подключиться к нему таким же образом. Вот в чем мои проблемы. Мой код опубликован ниже. Я не знаю, нужно ли мне снова получать адрес сервера таким же способом. Я не получаю ответ от сервера (я не знаю, должен ли я его получить на самом деле). Пожалуйста, задавайте любые вопросы или предложения, спасибо.
const int FTP_PORT = 21; // Порт сервера константный INT РАЗМЕР = 1024; // Размер буферов символ полученияBuff[РАЗМЕР]; // Буфер для отправки на сервер символ sendBuff[РАЗМЕР]; // Буфер для получения с сервера char pasvBuff[] = "pasv"; // Буфер, чтобы увидеть, была ли введена команда PASV char quitBuff[] = "ВЫЙТИ"; // Буфер, чтобы увидеть, была ли введена команда QUIT символ pasvMessage[100]; // Строка для информации PASV int main(int argc, char *argv[]) { длина int = 0, я = 0; int a1, a2, a3, a4, p1, p2, порт данных; //Информация PASV /* Получить имя сервера от пользователя */ если (арг!= 2) { cerr h_length); servAdr.sin_port = htons(dataPort); // Используем FTP-порт /* Создаем сокет для подключения к FTP-серверу */ интервал данныхSock; // Сокет данных в клиенте если ((dataSock = сокет(PF_INET, SOCK_STREAM, 0)) < 0) { perror("Клиент: сгенерировать ошибку"); возврат 3; } /* Подключаемся к FTP-серверу через порт данных */ if (connect(dataSock, (struct sockaddr *)&servAdr, sizeof(servAdr)) < 0) { perror("Клиент: ошибка подключения"); возврат 4; } read(dataSock, полученияBuff, sizeof(receiveBuff) - 1); write(fileno(stdout),receiveBuff, sizeof(receiveBuff) - 1); } } while (strncmp(sendBuff, quitBuff, 4) != 0); // Продолжаем, пока не будет введена команда QUIT закрыть (оригSock); вернуть 0; }
Мобильная версия