Newsgroup: it.comp.lang.c
Titolo: Problema con send e recv in remoto

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.(sresso codice
dekl 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 i lclient 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) va da remoto no :(
Non riesco a capire come mai le send e recv nn funzionino a dovere con
la connessione i nremoto .
Qualcuna spero mi sappia aiutare. C'è un modo x controllare il giusto
flusso di dati x garantire la giusta visualizzazione ????????
-----
Msg posted via: 
http://www.TechEye.it

viridovix wrote:

Non ci hai mostrato il codice relativo alle procedure di ascolto del server
(bind, listen, accept, ecc.) magari l'errore è lì (forse so anche la
soluzione)...
Postaci quel codice e ne riparleremo...
ciao
-- 
daniele_athome

Il codice x la creazione dei socket è perfettamente funzionante te lo
assicuro. Ci sono altre funzioni che spediscono e ricevono dati che
funzionano perferttamente.
il problema sta nelle send e recv che nn ricevono e inviano i dati
(cioè la matrice)coerentemente. Alcune volte infatto il client
visualizza la prima fila A1 A2 A3, e si blocca, altre volte nemmeno
quella e si blocca.
E come ho scritto sopra se i due processi stanno sulla stessa macchina
le read e send funzionano a dovere.
Nn so come poter controlloare e far in modo che ogni send spedisca
correttamente i dati e la recv li riceva correttamente.

 correttamente i dati e la recv li riceva correttamente.
Recentemente scrivevo un programma che usava massicciamente un collegamento
ad un server di posta pop3, connettendomi e disconnettendomi frequentemente
a quel server, e tra l'altro il sistema si č mostrato instabile di fronte a
questi massicci e frequenti cambi di operazione, non vorrei che fosse
quello il problema... In tal caso, la soluzione non la conosco nemmeno
io...
-- 
daniele_athome