2017-08-04 4 views
-3

J'écris un programme simple pour le transfert de fichiers d'un point à un autre. L'application devrait présenter l'option
1. Liste des fichiers
2. télécharger un fichier
3. télécharger un fichier
Mais une fois que j'ai choisi l'option 1. liste le contenu du répertoire, j'envoie les noms de fichiers un par un mais, mais tous les noms apparaissent dans une seule ligne sur le côté client. Ne peut pas comprendre pourquoi ..pas comming hors de l'interrupteur cas

Et puis il est coincé à l'intérieur de la boucle marquée, il devrait sortir de la boucle une fois recv est terminée et il doit présenter les options de l'opération à nouveau. Je ne suis pas sûr du problème. Voici mon code ..

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; 
     } 
    } 

Répondre

0

au moins que je comprends que vous voulez boucle jusqu'à ce que le bon fonctionnement est exécuté (dans ce cas 1 , 2 ou 3). si c'est le programme devrait sortir.

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; 
    } 
} 

ou vous voulez peut-être en boucle jusqu'à la sortie est choisie

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

Il ne fonctionne pas. Le problème est en ligne 'while ((rdata = recv (sockfd, nom de fichier, sizeof (nom de fichier), 0))> 0)'. Lorsque vous utilisez 'recv()' sans boucle, cela fonctionne très bien. Je suppose qu'il est coincé à l'intérieur de la boucle – surjit

+0

modifier votre réponse s'il vous plaît ou le supprimer .. ce n'est pas la réponse exacte –