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