PDA

Visualizza la versione completa : [C] Comunicazione client/server tramite Socket con proxy


Smack89
06-05-2012, 22:34
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



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



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 :fiore:

Smack89
07-05-2012, 20:53
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!!!

Loading