2010-11-22 4 views
2

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

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

буфер я иду с пути от клиента находят путь-файла, из буфера (это, где я есть проблемы) Ls -al записи в буфер (я написал его в .txt) wc write to buffer (я написал его в .txt) Путь записи в буфер (не сделали этого еще) Информация о пользователе записи в буфер (не сделали этого до сих пор) буфер отправить клиента клиента гравюр буфера со всеми этими деталями

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

ответ

0

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

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

правильный способ делать вещи (и то, как ваш инструктор, скорее всего, намерен вас сделать их) будет выполнять работу Л.С, туалет, и т.д. в пределах кода. Такая система вызова оставляет вас открытым для всего нового класса дыр в безопасности.

+1

Да, обратите внимание, например, что происходит в системном вызове, если имя файла включает «; rm -rf *;» – buddhabrot

0

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

0

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

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

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

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

  1. Поиска первого символа
  2. Держите некоторый флаг как «истина», если все последующие символы соответствуют ожидаемому характеру
  3. Если какой-то персонаж нарушает матч , перейдите к следующему поиску первого символа

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

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

0

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

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

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

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

0

К сожалению для ответа, как это, но я не имел счета, я новичок в этом (я не имел проблем с моими проектами в течение 4 лет: P) .I вставками

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

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