Как вы передаете путь от клиента к серверу?

Здравствуйте, я пытаюсь сделать 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; 
}
    }`

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

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

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

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

  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. Если какой-либо персонаж нарушает совпадение, перейдите к следующему поиску первого символа

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

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

Другие вопросы по тегам