Как вы передаете путь от клиента к серверу? - PullRequest
2 голосов
/ 22 ноября 2010

Здравствуйте, я пытаюсь сделать TCP-клиент / сервер, который я хочу эти вещи. Клиент предоставит имя файла или путь к имени файла файла. Сервер найдет этот файл и предоставит следующие данные: разрешения, размер, владелец, группа владельцев, дата изменения / создания, количество слов, идентификатор и приоритет пользователя и отправка их клиенту -1, если что-то пойдет не так. Клиент распечатает эти данные. Я сделал много это вещи, но у меня есть огромная проблема, поэтому я не могу продолжить, моя проблема заключается в том, что сервер не может распознать путь к файлу, но я попытался назвать файл и связать его в порядке. Что я делаю не так? Заранее спасибо

    CLIENT
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <netdb.h> 

        void error(char *msg)
        {
            perror(msg);
            exit(0);
        }

        int main(int argc, char *argv[])
        {
            int sockfd, portno, n;
            struct sockaddr_in serv_addr;
            struct hostent *server;

            char buffer[1024];
            if (argc < 3) {
               fprintf(stderr,"usage %s hostname port\n", argv[0]);
               exit(0);
            }
            portno = atoi(argv[2]);
            sockfd = socket(AF_INET, SOCK_STREAM, 0);
            if (sockfd < 0) 
                error("ERROR opening socket");
            server = gethostbyname(argv[1]);
            if (server == NULL) {
                fprintf(stderr,"ERROR, no such host\n");
                exit(0);
            }
            bzero((char *) &serv_addr, sizeof(serv_addr));
            serv_addr.sin_family = AF_INET;
            bcopy((char *)server->h_addr, 
                 (char *)&serv_addr.sin_addr.s_addr,
                 server->h_length);
            serv_addr.sin_port = htons(portno);
            if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
                error("ERROR connecting");
            printf("Please enter the filename or path of filename: ");
            bzero(buffer,1024);
            fgets(buffer,1024,stdin);
            n = write(sockfd,buffer,strlen(buffer));
            if (n < 0) 
                 error("ERROR writing to socket");
            bzero(buffer,1024);
            n = read(sockfd,buffer,1024);
            if (n < 0) 
                 error("ERROR reading from socket");
            printf("%s\n",buffer);
            return 0;



SERVER
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/resource.h>
#include <sys/time.h> 

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{    
     FILE *fp;
     int sockfd, newsockfd, portno, clilen,i;
     char buffer[1024],filename[1024];
     char * pPath;
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     int which = PRIO_PROCESS;
     id_t pid;
     int ret;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,1024);
     n = read(newsockfd,buffer,1024);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);

     system("ls -al 1.txt > ls.txt");
     system("wc -w 1.txt > wc.txt");



     /* pPath = getenv ("PATH");
     if (pPath!=NULL)
     printf ("The current path is: %s\n",pPath);

     system("touch path.txt");
     fp=fopen("path.txt","w");
      if (fp==NULL) exit(1);
 fprintf(fp,pPath);
     fclose(fp); */


     pid = getpid();
     ret = getpriority(which, pid);
     printf("priority %d user id %d ret %d",which,pid,ret);

system("paste ls.txt wc.txt user.txt > info.txt");

    fp=fopen("info.txt","r");

    if (fp==NULL) exit(1);

    for(int i=0;i<1000;i++){

            fscanf(fp,"%c",&buffer[i]);
    }
    fclose(fp);        

     n = write(newsockfd,buffer,1024);
     if (n < 0) error("ERROR writing to socket");
     return 0; 
}
    }`

Спасибо за быстрый ответ. Если быть точным, профессор не просил нас создать эти текстовые файлы, которые я создал, но я создал, потому что не мог найти решение и не мог записать все в буфер. быть таким:

буфер я иду с пути от клиента найти путь к файлу из буфера (вот где у меня проблема) ls -al запись в буфер (я записал его в .txt) wc пишет в буфер (я записал его в .txt) путь записи в буфер (еще не сделал) запись информации о пользователе в буфер (еще не сделал) отправка буфера клиенту клиент печатает буфер со всей этой информацией

Я пробовал sprintf, но я не совсем понял, как вы его используете, но эта команда выглядит лучше, чем моя, спасибо :). Нет, через буфер не передается, если я хорошо понимаю.

Ответы [ 5 ]

0 голосов
/ 22 ноября 2010

Извините за такой ответ, но у меня нет учетной записи, я новичок в этом (у меня не было проблем с моими проектами в течение 4 лет: P). Я вставляю

char lsbuf[1024];
sprintf(lsbuf,"ls -al %s > ls.txt",buffer);
system(lsbuf);

и работает почти как шарм ... Он принимает путь и делает ls, но не сохраняет ls в ls.txt (создает пустой файл) и не отправляет его в буфер. Также я попробовал заменить memset и работает !!

0 голосов
/ 22 ноября 2010

Во-первых, следует избегать использования bzero, поскольку эта функция устарела. Вместо этого используйте memset.

Функция fgets, читает до тех пор, пока не будет достигнут перевод строки или конец файла. Поскольку символ новой строки является допустимым символом, он добавляется в строку, а нулевой символ добавляется.

Если вы введете «mytext», а затем введете, буфер будет иметь «mytext \ n \ 0».

Основываясь на текущем коде, вы даже не используете буфер от клиента, поэтому очевидно, что он не работает (не потому, что это будет из-за поведения fgets () из-за добавленной новой строки).

0 голосов
/ 22 ноября 2010

Содержит ли путь, переданный на сервер, завершающий символ '\ n'?Если это так, вы должны удалить его (например, поместив символ \ 0)

0 голосов
/ 22 ноября 2010

В вашем текущем коде на самом деле ничего не сделано с вводом клиентами, и поведение не соответствует вашему описанию этого.
Что это должно делать?:

  for(int i=0;i<1000;i++){
      fscanf(fp,"%c",&buffer[i]);
  }
  fclose(fp);    

Это будет искать каждый символ на входе (учитывая, что здесь вы используете 1000, а буфер может содержать 1024 символа, вам не хватает последних 24 символов) и возвращать, сколько раз он встречается в файле «info.txt». Обратите внимание, что вы также выполните поиск символа NUL ('\ 0'). Помимо этих невнимательностей, это на самом деле ничего не делает.

Полагаю, вы просто хотите найти строку в файле и работать с номером строки? Вам нужен другой метод поиска строк. Для этого есть несколько умных и менее умных алгоритмов. Один из более «грубых» алгоритмов:

  1. Поиск первого символа
  2. Оставить флаг "true", если все последующие символы соответствуют ожидаемому символу
  3. Если какой-либо персонаж нарушает совпадение, перейдите к следующему поиску первого символа

Обратите внимание, что есть более эффективные алгоритмы, чем этот.

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

0 голосов
/ 22 ноября 2010

Возможно, вам понадобится передать путь в ваши системные вызовы. Выделите буфер (имейте в виду, что вы должны проверять свои буферы на предмет безопасности, но я понимаю, что это, вероятно, домашняя работа) и используйте sprintf (http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/):

char lsbuf[1024];
sprintf(lsbuf,"ls -al %s > ls.txt",buffer);
system(lsbuf);

Правильный способ сделать что-то (и способ, которым ваш инструктор, скорее всего, собирается это сделать), состоит в том, чтобы выполнять работу ls, wc и т. Д. В коде. Система вызова, подобная этой, открывает перед вами совершенно новый класс дыр в безопасности.

...