Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C]Problema Socket

    Ciao a tutti,
    sono qui per chiedervi un aiuto o almeno un'opinione su un problema
    che cerco di risolvere da tutta la settimana.
    Sto facendo un progetto per l'università in c, un programma Client Server,
    precisamente una Chat formata da Client che parlano
    tra loro attraverso un proxy server che li collega.
    Ora per esempio il mio client A richiede l'elenco dei nomi
    file messi a disposizione dal Client B, invia una richiesta
    DIR attraverso un messaggio passato al Proxy tramite la socket,
    il proxy invia al Client B la richiesta e il Client B
    manda l'elenco al Proxy che lo inoltra nuovamente al Client A.
    Il mio problema è:
    Questa cosa funziona solamente se la richiesta proviene
    da un client che non ha ancora inviato messaggi di Chat,
    altrimenti l'operazione DIR arriva al Proxy che la invia all'altro
    Client ma a questo punto Il client inserisce l'elenco di risposta nel messaggio,
    fa la write, ma il messaggio non arriva più al Proxy.
    Questi sono parti del codice:

    -Client nel punto dove riceve la richiesta di invio elenco

    codice:
    if (strcmp(messproxy.op,"DirRcv\n")==0){ 		
    printf("%s:Richiesta elenco file\n",messproxy.nick); 		
    fflush(stdout); 		
    bzero(&messproxy,dimp); 		
    dirp=opendir("FileSharing"); 		
    while(dirp) 		{ 		
    if((dp=readdir(dirp))!=NULL) 		
    { 		
    if(dp->d_name[0]!='.'){ 		
    strcat(messproxy.testo,dp->d_name); 		
    }		 		
    } 		
    else{ 		
    strcat(messproxy.testo,"\n"); 		
    closedir(dirp); 		
    dirp=NULL; 		
    } 		
    } 		
    printf ("TESTO=%s",messproxy.testo); 		
    fflush(stdout);	 		
    strcpy(messproxy.op,"Chat\n"); 		
    strcpy(messproxy.nick,nickname); 		
    bzero(&str,dimp); 		
    memcpy(str,&messproxy,dimp); 		
    if ((n=writen(sockfd,str,dimp))<0) 		
    { 					
    perror ("write error\n"); 					
    exit(-1); 		
    } 						 		
    printf ("INVIATO Elenco File\n"); 						
    printf ("\tOP\t=%s\n",messproxy.op); 						
    printf ("\tID=\t%d\n",messproxy.id);//magic number 						
    printf ("\tNICK=\t%s\n",messproxy.nick); 						
    printf ("\tSOCK=\t%d\n",messproxy.sock);
    printf ("\tTESTO=\t%s",messproxy.testo); 		
    fflush(stdout);	  	 		
    }
    -Proxy dove riceve la richiesta di elenco e passa l'informazione al Client opposto

    codice:
    	
    if (strcmp(messproxy.testo,"DIR\n")==0){  		 		
    if(fatto==0){ 
    printf ("%s:", client[i].nick1);
    printf ("%s",messproxy.testo);
    bzero(&messproxy,dim);
    strcpy(messproxy.op,"DirRcv\n");
    strcpy(messproxy.nick,client[i].nick1);
    messproxy.id=-1;
    messproxy.sock=-1;
    bzero(&buff,dim);
    memcpy(buff,&messproxy,dim); 						
    if ((n=write(client[i].sock2,buff,dim))<0) 				
    { 					
    perror ("write error"); 					
    exit(-1); 				
    } 				
    printf ("INVIATO CLIENT da Dir");		 						
    printf ("\tTesto=\t%s\n",messproxy.testo); 						
    printf ("\tNick=\t%s\n",messproxy.nick);  		
    } 		
    if(fatto==1){ 		
    printf (" %s :", client[i].nick2); 						
    printf ("\tTESTO=\t%s\n",messproxy.testo);
    bzero(&messproxy,dim);
    strcpy(messproxy.op,"DirRcv\n");
    strcpy(messproxy.nick,client[i].nick2);
    messproxy.id=-1;
    messproxy.sock=-1;
    bzero(&buff,dim);
    memcpy(buff,&messproxy,dim); 				
    if ((n=write(client[i].sock1,buff,dim))<0) 		
    {
    perror ("write error");				
    exit(-1);
    }	
    }	 		
    }

    Questa è la struttura del messaggio

    typedef struct protproxy
    {
    char op[20];
    char testo[1024];
    char nick[1024];
    int sock;
    int id; // magic number
    } mexproxy;

    mentre l'elenco client è gestito con un array di strutture fatte in questo modo

    typedef struct utente
    {
    int sock1;
    int sock2;
    char nick1[1024];
    char nick2[1024];
    int id; //magic number
    int socklog;
    char iplog[200];
    }user;

    Per questo troverete if(fatto==0){ if(fatto==1){
    perchè si riferiscono al primo o al secondo Client

    Spero mi possiate aiutare.

    Grazie

  2. #2
    Ho risolto:
    Il problema stava nel fatto che il proxy dopo che aveva controllato se era accaduto qualcosa sul socket1 e socket2 faceva i++ quindi arrivava nel ciclo while(i<=maxi) trovava i>maxi e non rientrava!Subito fuori dal while ho settato i=0 altrim non rientrava!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.