Readdir()错误输出

时间:2015-01-24 10:38:17

标签: c linux

使用server and client代码。 我尝试添加通过readdir()

实现的ls功能

我的* connection_handler看起来像这样:

void *connection_handler(void *socket_desc)
{
  //Get the socket descriptor
  int sock = *(int*)socket_desc;
  int n;
  int user_exists = 0;  

  char    sendBuff[3000], client_message[2000];
  char *command;
  char home_dir[500] = "simple_slash/simple_home/";
  char pwd[500];
  DIR *direc;
  struct dirent *temp_name;

  while((n=recv(sock,client_message,2000,0))>0) {
      //send(sock,client_message,n,0);
    if (user_exists!=0) {   
    printf("inside if case\n");
    /* get the first token */
    command = strtok(client_message," ");
    printf("%s\n",command );
    if (strcmp(command,"ls")==0) {
    printf("inside ls\n");

    command = strtok(NULL, " ");
    //ls ki permissions ka check
    //strcat(pwd,command);
    printf("%s\n", pwd);
    if ((direc= opendir (pwd)) != NULL) {
      /* print all the files and directories within directory */
      strcpy(sendBuff,"\0");
      while ((temp_name = readdir (direc)) != NULL) {
        strcat(sendBuff,temp_name->d_name);
        strcat(sendBuff,"\n");
      //      printf ("%s\n", temp_name->d_name);
      }
      send(sock, sendBuff,sizeof(sendBuff),0);
      closedir (direc);
    } else {
      perror ("could not open directory ");
      //return EXIT_FAILURE;
    }
  }
  else if (strcmp(command,"fput")==0) {
    printf("inside fput\n");
  }
  else if (strcmp(command,"fget")==0) {

  }
  else if (strcmp(command,"create_dir")==0) {
    /* code */
  }
  else {
    n=0;
    send(sock, "Invalid command. Please try again.",n,0);
  }
}
else {
  user_exists = 1;
  strcat(client_message,"\0");
  strcat(pwd,home_dir);
  strcat(pwd,client_message);
  mkdir (pwd, 0777);
  strcpy(sendBuff,"Welcome, ");
  strcat(sendBuff,client_message);
  strcat(sendBuff,"\n");
  send(sock, sendBuff,sizeof(sendBuff),0); 
}
memset(client_message, 0, 2000);
}
close(sock);

  if(n==0)
  {
    puts("Client Disconnected");
  }
  else
  {
    perror("recv failed");
  }
return 0;
}

当我在客户端运行ls命令时,代码在服务器端运行完美(由两者之间的printf语句验证)

但是输出每三次在客户端返回。

服务器端终端输出:

abc@ubuntu:~/SE/hw1$ ./server

Socket created

bind done

Waiting for incoming connections...

Connection accepted

Handler assigned

inside if case

ls

inside ls

simple_slash/simple_home/user2

inside if case

ls

inside ls

simple_slash/simple_home/user2

inside if case

ls

inside ls

simple_slash/simple_home/user2

inside if case

ls

inside ls

simple_slash/simple_home/user2

inside if case

ls

inside ls

simple_slash/simple_home/user2

客户端终端输出:

abc@ubuntu:~/SE/hw1$ ./client 

Connected successfully.

Enter Username : user2

Welcome, user2

ls

ls

..

folder1

.

ls

ls

ls

..

folder1

.

第1行:欢迎<用户名>

第2行:ls

第3行:ls给出输出


第1行:ls

第2行:ls

第3行:ls给出输出


我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我在这里做错了什么?

在问题开头提到的客户端代码每次输入一行时只从服务器连接读取一定数量的数据 - 它不一定在到达时读取所有数据。对于这种简单的中途工作方法,要求服务器不会发送比客户端愿意立即接收更多的字节;因为你说输出是每三次在客户端返回,服务器似乎发送的字节数是客户端预期接收的三倍,所以需要三次通过客户端循环才能只从服务器收集一个响应。

我写了“中途工作”,因为无法保证客户端收到一个recv()调用的响应,即使它的缓冲区足够大;你应该至少更改你的客户端,使其循环,直到它从服务器读取完整的sizeof sendBuff