На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела
1. Не создавайте несколько одинаковых тем, ибо модератор может расценить их, как спам и удалить все.
2. Для решения задач по GPSS есть отдельная тема. Все задачи по GPSS опубликовывать в этой теме! Перед опубликовыванием вашей задачи просмотрите всю тему, возможно вы сразу найдете решение.
3. Давайте вашим темам ОСМЫСЛЕННЫЕ названия, а также указывайте язык программирования. Пример: [Pascal]:Работа с файлами и записями.
4. Использования тега CODE обязательно при публикации текста программы.

Темы, оформленные с явным игнорированием правил и отсутствием смысла, будут закрыты/удалены!
Вам помогли? Напишите об этом здесь (в портфолио фрилансера)

Фрилансерам:
5. Демпинг цен запрещен (даже если Вы готовы работать бесплатно). Цены обсуждаются в приватном общении. Если вы готовы рещить задачу бесплатно, просто решите ее быстрее, чем возникнет предложение сделать это за деньги.
6. Пользователям, входящим в группу Newbie, запрещается предлагать свои услуги (завуалированно в т.ч.)
7. В посте с предложением выполнить работу, обязательно указывать ссылку на свое портфолио в Отзывы, Благодарности, Портфолио Это правило работает и в том случае, если вы выполняете работу бесплатно.
8. Реклама (даже завуалированная) своих фриланских сайтов запрещена

Нарушение данных пунктов влечет до RO или БАНА (при неоднократом)
Модераторы: ttiger, mikefreelance, Rust
  
    > 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;
        }
        Своеобразный "тест на профпригодность" наших фрилансеров :lol: __Век__, Майкфриланс, чем ответите? :lol:
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0200 ]   [ 15 queries used ]   [ Generated: 9.05.25, 08:46 GMT ]