Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[C]problema con send e recv in remoto

14 views
Skip to first unread message

viridovix

unread,
Aug 27, 2005, 6:10:25 PM8/27/05
to
Sistema op suse 9.2 compilatore gcc linguaggio C (stesse versioni su
entrambi i PC).
Server e client sono connessi tramite socket con protocollo TCP
Un server invia una matrice(statica) al client che la visualizza su
schermo.

1 caso) Client e server girano sulla stessa macchina(cmq viene simulta
la connessione xchè si utlizzano i socket).
La visualizzazione da parte del client su video avviene senza problemi.

2 caso) Client e Server girano su macchine differenti.(stesso codice
del primo caso) .
IL client nn visualizza la matrice (a volte in parte ,a volte no) e si
blocca.

Di seguito riporto il codice del server che inizializza/crea la
matrice.
Non fate caso al puntatore che mi serve x mantenre condiviso un
flag(posto vuoto/libero) che cmq nn viene utilizzato con la send e
recv, quindi nn coinvolge il client.
[code]
struct posto
{
unsigned char idPosto[6]; // i caratteri che indicano fila e posto
sono
memo qui
int *flag; // flag poso libero/prenotato
};
[/code]


[code]
struct posto cinema [3][3];

void inizializza_cinema(struct posto cine[3][3],int *p)
{

unsigned char i,j,k;
int *pp,*ppp;
pp=p;
ppp=p;
for(i='A';i<='C';i++)
{

for(j='1';j<='3';j++)
{cine[i-'A'][j-'1'].flag=ppp;
ppp=ppp+1;
}
}

k='1';
for(i='A';i<='C';i++)
{

for(j='1';j<='3';j++)
{ *pp=0;
cine[i-'A'][j-'1'].flag=0;
cine[i-'A'][j-'1'].idPosto[0]=' ';
cine[i-'A'][j-'1'].idPosto[1]=i;
cine[i-'A'][j-'1'].idPosto[2]=j;
cine[i-'A'][j-'1'].idPosto[3]=' ';
cine[i-'A'][j-'1'].idPosto[4]='\t';
cine[i-'A'][j-'1'].idPosto[5]='\0';
pp=pp+1;
}
cine[i-'A'][2].idPosto[4]='\n';
}
};
[/code]

di seguito il codice del server che spedisce la matrice vettore x
vettore al client.
[code]

void posti_vuoti(struct posto cine[3][3],int *p)
{ int *pp;
pp=p;
unsigned char i,j;
i='A';
j='1';
send(ds_sock_acc,"\n\nI posti contrassegnati con le parentesi quadre
sono
già
assegnati!!\n\n",MAX_DIM,0);

for (i='A'; i<='C'; i++)
{

for (j='1'; j<='3'; j++)
{
if (*pp==0)
if (cine[i-'A'][j-'1'].flag==0)
{ cine[i-'A'][j-'1'].idPosto[0]=' ';
cine[i-'A'][j-'1'].idPosto[3]=' ';
send(ds_sock_acc,&cine[i-'A'][j-'1'].idPosto,MAX_DIM,0);

}
else //posto occupato lo stampo tra le parentesi []
{ cine[i-'A'][j-'1'].idPosto[0]='[';
cine[i-'A'][j-'1'].idPosto[3]=']';

send(ds_sock_acc,&cine[i-'A'][j-
'1'].idPosto,MAX_DIM,0);
}
pp=pp+1;
}
}


send (ds_sock_acc,"\nFatto",10,0);
};
[/code]

ora codice funzione visualizza matrice del client:

[code]
void visualizza()
{ char buf[MAX_DIM];
do
{
recv(ds_sock,&buf,MAX_DIM,0);
if (strcmp(buf,"Fatto")!=0)
{
printf("%s",buf);
}
}
while (strcmp(buf,"\nFatto")!=0);
sleep(3);

};
[/code]

Quindi il client x primo stampa il messaggio :i posti prenotato si
trovano tra parentesi []
il primo vettore della matrice A1 A2 A3 e poi si blocca.
Nel caso di processi su macchina locale come detto il client stampa
A1 A2 A3
B1 B2 B3
C1 C2 C3
Quindi il server invia \nFatto che è la condizione di uscita.
Ripeto in locale(simulata xro' la connessione) funziona, da remoto no
:(
Non riesco a capire come mai le send e recv nn funzionino a dovere con
la connessione in remoto .
Qualcuna spero mi sappia aiutare. C'è un modo x controllare il giusto
flusso di dati x garantire la giusta visualizzazione ????????

0 new messages