首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Readdir()错误输出

Readdir()错误输出
EN

Stack Overflow用户
提问于 2015-01-24 10:38:16
回答 1查看 93关注 0票数 0

使用server and client代码。我尝试添加通过readdir()实现的ls功能。

我的*connection_handler看起来是这样的:

代码语言:javascript
复制
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语句验证)

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

服务器端终端输出:

代码语言:javascript
复制
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

客户端终端输出:

代码语言:javascript
复制
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输出

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2015-08-10 08:32:18

我在这里做错什么了?

问题开头提到的客户端代码每次输入一行时只从服务器连接读取一定数量的数据--它不一定在到达时读取所有数据。要使这种简单的方法工作到一半,将需要服务器发送的字节不超过客户端一次愿意接收的字节;因为您说每三次在客户端返回输出,服务器似乎发送的字节是客户机期望接收的字节的三倍左右,因此需要三次通过客户端循环从服务器收集一个响应。

我写了“工作半途而废”,因为即使它的缓冲区足够大,也不能保证客户机收到一个recv()调用的响应;您至少应该更改客户机,以便它循环,直到它从服务器读取了完整的sizeof sendBuff

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28124586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档