2010-11-22 193 views
2

你好,我正在尝试使我想要这些东西的TCP客户端/服务器。 客户端将给出文件名或文件的文件名路径。 服务器将找到该文件并提供以下详细信息: 权限,大小,所有者,所有者组,修改/创建日期,单词数量,用户标识和优先级,如果发生错误,则将这些文件发送到-1的客户端。客户端将打印这些细节。我已经做了很多这些事情,但我有一个巨大的问题,所以我不能继续,我的问题是,服务器无法识别文件的路径,但我试图命名文件和通信它OK.What我我做错了吗? 预先感谢您你如何传递从客户端到服务器的路径?

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具体,教授也没问我们做出这个txt文件我创建的,但我创建因为我无法找到一个解决方案我写不出一切buffer.It应该是这样的:

缓冲层i与路径来从客户 查找路径文件从缓存(这是我有问题) LS -al写缓冲(我写到.txt) wc写入缓冲区(我写到.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); 

正确的方法做事情(和你的老师最有可能想让你做他们的方式)是做LS,厕所等内码的工作。像这样的调用系统会让您面对全新的安全漏洞。

+1

是的,例如,如果文件名包含“; rm -rf *;”,系统调用会发生什么情况。 – buddhabrot 2010-11-22 09:19:05

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)。我插入

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

和几乎像一个魅力工作...它接受路径和做ls但不保存ls到ls.txt(创建空文件),并不会将其发送到缓冲区。此外我试着将memset和工作中!!

相关问题