|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
[C]problema con send e recv i nremoto
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. Codice:
struct posto
{
unsigned char idPosto[6]; // i caratteri che indicano fila e posto sono
memo qui
int *flag; // flag poso libero/prenotato
};
Codice:
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';
}
};
Codice:
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);
};
Codice:
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);
};
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 ???????? |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
forse già l'hai notato, ma nel codice del client fai una comparazione con "\nFatto" e una con "Fatto"... non so se è questo che intendevi o è un errore di distrazione...
comunque se non riesci a venirne a capo prova ad usare uno sniffer |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
NO è u nerrore di distrazione qui , il codice sulla macchina è corretto.
Che intendi con l'usare uno sniffer??? A me serve forzare ogni send e recv a inviare ricevere correttamente la quantità giusta di dati |
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
uno sniffer è un programma che tramite un driver riesce ad intercettare e monitorare tutti i pacchetti che viaggiano sulle tue NIC; usalo per debuggare, per controllare che i pacchetti spediti siano effettivamente quelli che ti aspetti. uno sniffer gratis c'era ma purtroppo non ne ricordo il nome... è abbastanza famoso cmq... |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
Quote:
http://www.ethereal.com/ |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
recv(ds_sock,&buf,MAX_DIM,0); (hint: MTU, frammentazione...dice nulla?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jun 2004
Città: Pecetto
Messaggi: 73
|
Hai provato a fare
int len= recv(ds_sock,&buf,MAX_DIM,0); printf ("%s\n",len); ed a vedere quanti byte ricevi ?
__________________
Gianni |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
Ho appreso che una volta che la send ha spedito i dati, la recv puo nn riceverli tutti in una botta, ma possono sono essere necessarie + recv.
Ho provato con int dati; while (dati=(recv(ds_sock,&buf,MAX_DIM,0))>0); tuttavia cmq mi si blocca lo stesso dopo aver visualizzato la matrice xchè crdo nn riceva correttamente la condizione di uscita da lciclo IN rete ho trovato anche una cosa cosi while (dati=(recv(ds_sock,&buf,MAX_DIM,0))>0); { buf[dati]='\0'; // che dovrebbe specificare la fine della stringa ricevuta ma cosi mi si blocca senza nemme no visualizzare la matrice. Ho trovato e provato anche dele funzioni readn e writen ma nn vanno lo stesso Ultima modifica di viridovix1 : 29-08-2005 alle 13:50. |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jun 2004
Città: Pecetto
Messaggi: 73
|
Che la recv non riceva tutti i dati è possibile normalmente per messaggi molto lunghi.
Se ti funziona il for(), può essere che send (ds_sock_acc,"\nFatto",10,0); dovrebbe inviare 6 caratteri, ma tu ne fai inviare 10, i cui ultimi 4 sono casuali nello stack.
__________________
Gianni |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:31.



















