[英]Readdir() erroneous output
使用服務器和客戶端代碼。 我嘗試添加通過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提供輸出
我在這里做錯了什么?
我在這里做錯了什么?
問題開頭提到的客戶端代碼每次鍵入一次行時都僅從服務器連接中讀取一定數量的數據-不一定在到達時讀取所有數據。 為了使這種簡單的方法能夠半途工作,將要求服務器發送的字節數不要超過客戶端一次願意接收的字節數。 由於您說輸出是每隔第三次在客戶端返回一次 ,因此服務器似乎發送的數據量大約是客戶端希望接收的字節的三倍,因此需要經過三遍客戶端循環才能從服務器收集一個響應。
我之所以寫“中途工作”,是因為即使緩沖區足夠大,也不能保證客戶端通過一個recv()
調用收到響應。 您至少應該更改您的客戶端,以使其循環直到從服務器讀取完整sizeof sendBuff
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.