2017-08-04 68 views
-3

我正在寫一個簡單的程序來將文件從一個點傳輸到另一個。該應用程序應該出現的選項
1.列表中的文件
2.下載文件
3.上傳文件
但是,一旦我選擇了選項1.它列出目錄的內容,我送一個文件名通過一個,但所有的名字都出現在客戶端的一行中。不知道爲什麼..不從開關案件

然後它卡在標記循環內,一旦recv完成,它應該從循環中出來,它應該再次提供操作選項。我不確定問題是什麼。 這裏是我的代碼..

server.c

while(1){ 
    //receive chosen option to be performed 
    if((rdata = recv(clnt, &x, sizeof(int), 0)) > 0){ 
    opt = ntohl(x); 
    switch(opt){ //switch option and operate 
    case 1 : //option 1- transfer contents of the directory 
     if((dr = opendir(".")) != NULL){ 
     while((de = readdir(dr)) != NULL){ //open directory 
      sprintf(filename, "%s",de->d_name); 
      rdata = send(clnt, filename, strlen(filename), 0); //transfer filenames 
     } 
     } 
     break; 
    } 

client.c

while(1){ //this loop should continue after performing one option 
     printf("1. List available files on the server\n"); 
     printf("2. Download a file\n"); 
     printf("3. Upload a file to the server\n"); 
     scanf("%d", &opt); //enter desired option 
     x = htonl(opt); //convert to network byte order 
     if(send(sockfd, &x, sizeof(int), 0) < 0){ //send option 
     perror("client: send"); 
     continue; 
     } 
     switch(opt){ 
     case 1 : 
/************************************************************************/ 
      while((rdata = recv(sockfd, filename, sizeof(filename), 0)) > 0){ 
      filename[rdata] = '\0'; 
      printf("> %s\n", filename); 
      } 
/***********************************************************************/ 
      break; 
     } 
    } 

回答

0

至少據我所知,直到執行正確的操作(在這種情況下,1要循環,2或3)。如果是程序應該退出。

int loop = 1; 

while(loop){ 
    loop = 0; 
    printf("1. List available files on the server\n"); 
    printf("2. Download a file\n"); 
    printf("3. Upload a file to the server\n"); 
    scanf("%d", &opt); 
    x = htonl(opt); 
    if(send(sockfd, &x, sizeof(int), 0) < 0){ 
    perror("client: send"); 
    continue; 
    } 
    switch(opt){ 
    case 1 : 
     while((rdata = recv(sockfd, filename, sizeof(filename), 0)) > 0){ 
     filename[rdata] = '\0'; 
     printf("> %s\n", filename); 
     } 
     break; 
    default: 
     loop = 1; 
     break; 
    } 
} 

或者也許你想退出循環選擇

int loop = 1; 

while(loop){ 
    printf("1. List available files on the server\n"); 
    printf("2. Download a file\n"); 
    printf("3. Upload a file to the server\n"); 
    printf("4. Exir\n"); 
    scanf("%d", &opt); 
    x = htonl(opt); 
    if(send(sockfd, &x, sizeof(int), 0) < 0){ 
    perror("client: send"); 
    continue; 
    } 
    switch(opt){ 
    case 1 : 
     while((rdata = recv(sockfd, filename, sizeof(filename), 0)) > 0){ 
     filename[rdata] = '\0'; 
     printf("> %s\n", filename); 
     } 
     break; 
    case 4: 
     loop = 0; 
     break; 
    default: 
     break; 
    } 
} 
+0

它不工作,直到。問題出在'while((rdata = recv(sockfd,filename,sizeof(filename),0))> 0)'line。當你使用'recv()'而沒有循環時,它可以正常工作。我想它被卡在循環內 – surjit

+0

請編輯您的答案或刪除它..這不是確切的答案 –