Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 11:59   #1
arcticworker
 
Регистрация: 08.12.2011
Сообщений: 3
Стрелка ftp клиент

надо написать ftp клиент, вот кое-что нашел в интернете, с помощью этого я могу подключится к ftp серверу и залогиниться на нем (на картинке это можно увидеть), вопрос в том как переходить по каталогам и скачивать/закачивать файлы. на сервере же обычно есть стандартные команды:
ABOR — Прервать передачу файла
CDUP — Сменить директорию на вышестоящую.
CWD — Сменить директорию.
DELE — Удалить файл (DELE filename).
EPSV — Войти в расширенный пассивный режим. Применяется вместо PASV.
HELP — Выводит список команд принимаемых сервером.
LIST — Возвращает список файлов директории. Список передается через соединение данных.
ну и много других
отсюда еще один вопрос как передать эти команды на сервер чтобы они работали??
возможно я в чем-то ошибаюсь тогда поправьте меня
можно выкладывать куски кода или указать что и где почитать.
Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
 
int s;
int ds;
using namespace std;
 
int init_sock() {
    int len;
    sockaddr_in address;
    int result;
    //int s;
    s = socket(AF_INET, SOCK_STREAM,0);
    address.sin_family = AF_INET;   ///интернет домен
    address.sin_addr.s_addr = inet_addr("192.168.0.2");   ///соединяемся с 127,0,0,1
    address.sin_port = htons(21);    /// 21 порт
    len = sizeof(address);
    result = connect(s, (sockaddr *)&address, len);   ///установка соединения
    if (result == -1) {
        perror("oops: client");
        return -1;
    }
    return s;
}
 
 
 
int readServ(int s) {
    int rc;
    fd_set fdr;
    FD_ZERO(&fdr);
    FD_SET(s,&fdr);
    timeval timeout;
    timeout.tv_sec = 1;   ///зададим  структуру времени со значением 1 сек
    timeout.tv_usec = 0;  
    do {
        char buff[512] ={' '};
        recv(s,&buff,512,0);   ///получаем данные из потока
        cout << buff;
        rc = select(s+1,&fdr,NULL,NULL,&timeout);    ///ждём данные для чтения в потоке 1 сек. 
    } while(rc);     ///проверяем результат
    return 2;
}
 
int init_data() {
    //int ds;
    send(s,"PASV\r\n",strlen("PASV\r\n"),0);
    char buff[128];
    recv(s,buff,128,0);
    cout << buff; ////выводим на экран полученную от сервера строку
 
    int a,b;
    char *tmp_char;
    tmp_char = strtok(buff,"(");
    tmp_char = strtok(NULL,"(");
    tmp_char = strtok(tmp_char, ")");
    int c,d,e,f;
    sscanf(tmp_char, "%d,%d,%d,%d,%d,%d",&c,&d,&e,&f,&a,&b);
    int len;
    sockaddr_in address;
    int result;
 
    int port = a*256 + b;
 
    ds = socket(AF_INET, SOCK_STREAM,0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("192.168.0.2");
    address.sin_port = htons(port);
    len = sizeof(address);
    result = connect(ds, (sockaddr *)&address, len);
    if (result == -1) {
           perror("oops: client");
        return -1;
    }
    return 0;
}
 
  
  int login() {
    cout << "Введите имя: "; char name[64]; cin >> name;
    char str[512];
    sprintf(str,"USER %s\r\n",name);
    send(s,str,strlen(str),0);
    readServ(s);
    cout << "Введите пароль: "; char pass[64]; cin >> pass;
    sprintf(str,"PASS %s\r\n",pass);
    send(s,str,strlen(str),0);
    readServ(s);
    return 0;
}
 
int main() {
   char sym[5] = "LIST";
   s = init_sock();
   readServ(s);
   
   login();
   init_data();
   send(s,sym,strlen(sym),0);
   sleep(20);
   
 
   close(s);  ///закрытие соединения
   return 0;
}
Изображения
Тип файла: png Снимок.png (17.3 Кб, 286 просмотров)
arcticworker вне форума Ответить с цитированием
Старый 22.05.2012, 12:08   #2
therightrussia2
Пользователь
 
Аватар для therightrussia2
 
Регистрация: 21.05.2012
Сообщений: 24
По умолчанию

У вас есть реализованные функции send и readserv, добавьте посылку соответствующих команд по аналогии с логином

Для начала советую проделать необходимые команды с командной строки и постепенно их добавлять в приложение.
Правильная Россия - нам нужны программисты
http://dimaovsyannikov.livejournal.com
http://www.programmersforum.ru/showpost.php?p=1047533&postcount=1
therightrussia2 вне форума Ответить с цитированием
Старый 22.05.2012, 18:49   #3
arcticworker
 
Регистрация: 08.12.2011
Сообщений: 3
По умолчанию

therightrussia2, да и вправду через send можно отправлять команды, не догадался я. спасибо
но теперь другая проблема я допустим запрашиваю список файлов с помошью команды LIST но он ничего не выводит, точнее пишет что считал но не выводит этого списка, при этом если подключится к ftp с помощью стандартной терминальной команды "ftp" и запросить список с помошью ls или nlist то нормально выводится список файлов. это можно увидеть на картинке.
в коде изменял только main вот он:
Код:
int main() {
   //int s;
   char sym[512];
   char st[512];

   s = init_sock();
   readServ(s);

   login();
   
   init_data();
   
   cout << "Введите команду: "; 
   char com[64];
   cin >> com;
   sprintf(st,"%s\r\n",com);
   send(s,st,strlen(st),0);
   recv(s,sym,512,0);
   cout << sym;
   readServ(s);
   
   recv(s,sym,512,0);
   cout << sym;
   readServ(s);

   close(s);  ///закрытие соединения
   return 0;
}
Изображения
Тип файла: jpg Снимок-4.jpg (28.2 Кб, 181 просмотров)
arcticworker вне форума Ответить с цитированием
Старый 23.05.2012, 09:55   #4
therightrussia2
Пользователь
 
Аватар для therightrussia2
 
Регистрация: 21.05.2012
Сообщений: 24
По умолчанию

Ну если вы всерьез хотите взяться за написание такого сетевого приложения то первым делом сделайте везде при работе с сетевыми функциями проверку возвращаемых значений.

Без этого понять что происходит невозможно как один из вариантов из-за того что в функции readServ установлен таймаут на операцию всего 1 секунда то она могла просто не успеть считать данные. После каждого вызова отсылки или приема данных выводите код возврата которые вы получаете от сокетных функций send и recv
Правильная Россия - нам нужны программисты
http://dimaovsyannikov.livejournal.com
http://www.programmersforum.ru/showpost.php?p=1047533&postcount=1
therightrussia2 вне форума Ответить с цитированием
Старый 23.05.2012, 13:31   #5
arcticworker
 
Регистрация: 08.12.2011
Сообщений: 3
По умолчанию

therightrussia2 поставил проверку всех send и recv, нигде нет ошибки.
да и сам ftp сервер возвращает трехзначные числа и комментарии к ним, и он то же не говорит о какой-либо ошибке
вот что происходит при моей программе:
Код:
Введите команду: LIST
150 Opening ASCII mode data connection for /bin/ls.
226 Transfer complete. 268 bytes transferred. 0,26 KB/sec.
и вот что при стандартной терминальной команде:
Код:
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
-rw-rw-rw-   1 user     group           0 May 20 21:28 1.txt.txt
-rw-rw-rw-   1 user     group           0 May 20 21:04 768.txt
drwxrwxrwx   1 user     group           0 May 22 18:52 lol
drwxrwxrwx   1 user     group           0 May 20 21:04 ?????????? ??????????
226 Transfer complete. 268 bytes transferred. 0,26 KB/sec.
и там и там возращает две одинаковые строки:
150 Opening ASCII mode data connection for /bin/ls.
226 Transfer complete. 268 bytes transferred. 0,26 KB/sec.
но в моей программе теряется список файлов, который и должен быть между этими двумя строками.
и да, таймаут увеличил до 5 секунд но ничего не изменилось
arcticworker вне форума Ответить с цитированием
Старый 23.05.2012, 15:38   #6
therightrussia2
Пользователь
 
Аватар для therightrussia2
 
Регистрация: 21.05.2012
Сообщений: 24
По умолчанию

у сделайте команду "узнать текущий каталог" я почти уверен что они будут разные
Правильная Россия - нам нужны программисты
http://dimaovsyannikov.livejournal.com
http://www.programmersforum.ru/showpost.php?p=1047533&postcount=1
therightrussia2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FTP клиент Andr Работа с сетью в Delphi 7 18.02.2016 12:22
Активный FTP клиент Alexandee67 Работа с сетью в Delphi 6 13.01.2011 23:25
ftp клиент blacknike PHP 2 14.11.2010 16:14
ftp клиент на winsock sergoss Работа с сетью в Delphi 1 07.05.2009 19:07