На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Собственный FTP клиент или безысходность за 12 часов до сдачи проекта. , Сказ о нерадивом студенте и программировании сокитов.
      Приветствую вас уважаемые форумчане, всем доброго времени суток. Передо мной была поставлена задача по реализации собственного консольного FTP клиента совместимого со сторонними FTP серверами, способного залогинится на сервере, выполнить следующие стандартные команды: ls, pwd, put, get, cd, quit. На данный момент клиент способен по ip подсоединиться к стандартному серверу, а так же готовы команды: pwd, cd, quit... А вот с оставшимися реальные проблемы ибо для их реализации требуется выковырять из сервера номер порта по которому устанавливается соединение для передачи файлов между севером и клиентом, а я хоть и примерно представляю себе как это сделать, но крайне смутно... Да и не в том я состоянии для маштабной интеллектуальной деятельности.. Чай третий день уже без сна до сдаю проекты и дописываю проекты и дописываю курсовую (Это даже не преувеличение, четвертая ночь пошла). В связи с этим буду рад вашим советам, по реализации данных команд (ls, get, put), с радостью приму любые советы. Исходники своего клиента будет ниже в сообщении. Заранее благодарю.

      ExpandedWrap disabled
        #include <stdio.h>
        #include <fcntl.h>
        #include <netdb.h>
        #include <unistd.h>
        #include <stdlib.h>
        #include <strings.h>
        #include <string.h>
        #include <signal.h>
        #include <sys/types.h>
        #include <sys/wait.h>
        #include <sys/stat.h>
        #include <sys/sendfile.h>
        #include <unistd.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
         
        #include <arpa/inet.h>
        #include <errno.h>
        #include <libgen.h>
         
        #include <dirent.h>
        #include <string.h>
        #include <time.h>
        #include <pwd.h>
        #include <grp.h>
         
        #define PORTNUM 21
         
        int s, ds, k, i,  result, size;
        char addr;
         
        // --------------------------------------Создаем подключение-------------------------------------
        int init_client(char* a){
          char* b;
          int len;
          struct sockaddr_in server;
          s = socket(AF_INET, SOCK_STREAM, 0);
          if(s == -1){
            perror("socket creation failed");
            exit(1);
          }
          if(inet_aton(a, &server.sin_addr) > 0){
            server.sin_family = AF_INET;
            server.sin_port = htons(PORTNUM);
            server.sin_addr.s_addr = inet_addr(a);
            strcpy(&addr, a);
          }
          else{
            struct hostent *he;
            he = gethostbyname(a);
            b = inet_ntoa(*(struct in_addr*)he->h_addr);
            server.sin_family = AF_INET;
            server.sin_port = htons(PORTNUM);
            server.sin_addr.s_addr = inet_addr(b);
            printf("%s\n",b);
            strcpy(&addr, b);
          }
          len = sizeof(server);
          k = connect(s,(struct sockaddr*)&server, len);
          if(k == -1){
            perror("Connect Error");
            exit(1);
          }
          return 0;
        }
         
        //---------------------------------------Читаем сообщений сервера----------------------------
         
        int readServ(int i) {
            int rc;
            fd_set fdr;
            FD_ZERO(&fdr);
            FD_SET(i,&fdr);
            struct timeval timeout;
            timeout.tv_sec = 1;   ///зададим  структуру времени со значением 1 сек
            timeout.tv_usec = 0;
            do {
                char buff[512] ={' '};
                recv(i,&buff,512,0);   ///получаем данные из потока
                printf("%s",buff);
                rc = select(i+1,&fdr,NULL,NULL,&timeout);    ///ждём данные для чтения в потоке 1 сек.
            } while(rc);     ///проверяем результат
            return 0;
        }
         
        //-----------------------------Передаем серверу логин пароль-----------------------------------
         
        int login() {
            printf("Введите имя: \n");
            char name[64];
            scanf("%s", name);
            char str[512];
            sprintf(str,"USER %s\r\n",name);
            send(s,str,strlen(str),0);
            readServ(s);
            printf("Введите пароль: \n");
            char pass[64];
            scanf("%s",pass);
            sprintf(str,"PASS %s\r\n",pass);
            send(s,str,strlen(str),0);
            readServ(s);
            return 0;
         
        }
         
         
        //------------------------Говорим серверу вернуть адрес текущей директории----------------------
        /*int pwd(){
          char buff[128];
          sprintf(buff, "PWD \r\n");
          send(s, buff, strlen(buff), 0);
          recv(s, buff, 256, 0);
          printf("Путь к текущей директории: %s\n", buff);
          return 0;
        }*/
         
        int pwd(){
          char buff[512];
          sprintf(buff,"PWD \r\n");
          send(s, buff, strlen(buff), 0);
          readServ(s);
          return 0;
        }
         
        -------------------------Передаем команду сменить директорию----------------------
         
        int cd(char* str){
          char buff[128];
          sprintf(buff, "CWD %s\r\n", str);
          send(s, buff, strlen(buff), 0);
          //recv(s, buff, 128, 0);
          readServ(s);
          return 0;
        }
         
        -----------------------------Неудачный эксперемент на тему ls------------------
        у ls
        int ls(){
          /*struct sockaddr_in address;
          int a, b, c, d, e, f;
          char buff[512];
         
          char size[128];
          sprintf(size, "PASV\r\n");
         
          send(s, size, 128, 0);
          recv(s,size,128,0);
         
          printf("%s",size);
         
          char *tmp_size;
          tmp_size = strtok(buff,"(");
          tmp_size = strtok(NULL,"(");
          tmp_size = strtok(tmp_size, ")");
         
          printf("a\n");
          sscanf(tmp_size, "%d,%d,%d,%d,%d,%d",&c,&d,&e,&f,&a,&b);
          int result;
          int port = a*256+b;
         
          ds = socket(AF_INET, SOCK_STREAM,0);
          address.sin_family = AF_INET;
          address.sin_port = htons(port);
          address.sin_addr.s_addr = inet_addr(&addr);
         
          result = connect(ds, (struct sockaddr *)&address, sizeof(address));
          if (result == -1) {
              perror("client");
              return -1;
          }*/
         
          char buff[128];
          strcpy(buff, "PASV LIST \r\n");
         
          send(s, buff, 128, 0);
          recv(s, buff, 128, 0);
         
          readServ(s);
         
          return 0;
        }
         
        --------------------------отключение от сервера-----------------------------------------
         
        int quit(){
          char buff[512];
          strcpy(buff, "QUIT \r\n");
          send(s, buff, 512, 0);
          exit(0);
        }
         
         
        int main(int argc, char* argv[]){
          char* com_list[20] = {"ls", "put", "get", "pwd", "cd", "quit", "?"}; //Список доступны команд
          char str[512], com[5];
         
          init_client(argv[1]);
          login();
         
          while(1){ //До тех пор пока не встретим в списке переданную нам команду или не осмотрим весь список смотрим массив
            printf("Введите команду:\n");
            scanf("%s", com);
            int i = 0;
            while(com_list[i]){
              if(strcmp(com, com_list[i]) == 0){
                break;
              }
              i++;
            }
            switch(i){//По индексу определяем нужную команду
              case 0:
                ls();
                break;
              case 1:
                /*printf("Введите имя файла:");
                scanf("%s", com);
                put(com);*/
                break;
              case 2:
                /*printf("Введите имя файла:");
                scanf("%s", str);
                get(str);
                break;*/
              case 3:
                pwd();
                break;
              case 4:
                printf("Введите путь для смены директории: ");
                scanf("%s", str);
                cd(str);
                break;
              case 5:
                quit();
                break;
              case 6:
                printf(" ls - список файов текущей дериктории.\n put - положить файл.\n get - взять файл.\n cd - сменить католог.\n delete - удаление файла \n quit - выключить клиент- сервер.\n ? - справка.\n\n");
                break;
              case 7:
                printf("Неверная команда\n\n");
                break;
            }
          }
          return 0;
        }
      Сообщение отредактировано: DLamer -
        Цитата DLamer @
        Чай третий день уже без сна до сдаю проекты и дописываю проекты и дописываю курсовую

        DLamer, извиняй за оффтоп. Сам в таком режиме сдавал диплом - сочувствую. Если время жмет - обращайся в наш раздел "помощь студентам". Там тебе гораздо быстрее помогут за небольшую плату. Но твои вопросы явно не будут проброшены.

        Ну а если время терпит - не вопрос, давай тут решать.
          Цитата JoeUser @


          Спасибо за совет, попробую.)
            DLamer, и еще ... если дисциплина не требует чистого Си - пользуйся конструкциями C++, тупо сэкономишь время, и домашнее электричество на набор текста :lol:
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0289 ]   [ 16 queries used ]   [ Generated: 19.04.24, 13:38 GMT ]