PDA

View Full Version : Socket TCP Trasferire GROSSI DATI - problema Buffer?


parisisalvo
28-06-2005, 16:41
Salve
devo trasferire, delle mega strutture da 22kb ciascuna.
Se attraverso la send inserisco tutta la struttura, dall'altro lato (lato ricevente) vengono ricevuti circa 15 pacchetti da 1,5Kb (sto lavorando in wireless).
La mia domanda è ?
c'e' un metodo migliore? mi convine frammetare da me i dati o lo faccio fare tranquillamente a lui?
seconda cosa...man mano che mi arrivano i dati sul buffer, come li accodo per ottenere un unico buffer?
a) funzione per concatenare stream di bytes ?
b) funzione per copiare da uno stream di bytes tot dati con un ben preciso shift di n byte (tipo bcopy ma con lo shift di n byte) ?
Grazie
Salvo

ilsensine
28-06-2005, 21:43
Salve
Se attraverso la send inserisco tutta la struttura, dall'altro lato (lato ricevente) vengono ricevuti circa 15 pacchetti da 1,5Kb (sto lavorando in wireless).
Normale

I sistemi posix definiscono il flag MSG_WAITALL per la recv che potrebbe esserti di aiuto se usi simili sistemi (unix & co). Personalmente preferisco delle letture multiple (con una poll con timeout se vuoi fare le cose per bene).

parisisalvo
28-06-2005, 23:30
Salve, anke io ho optato per delle letture multiple...alla fine i dati sono eterogenei, quindi nn ho problemi a sbatterli tutti dentro un mega buffer...MA HO UN PROBLEMA, in codice...quel che faccio è :
int n;
char *buffer;
char *b;
char *megabuffer;
char *p; // il puntatore che puntera' alla prima posizione libera del megabuffer...

buffer=malloc(2000);
b=malloc(2000);
megabuffer=malloc(20000);
p=megabuffer;
while(1)
{
n=recv(s, buffer,2000,0);
bcopy(buffer,b,n);
...
...
bcopy(b,p,n); // copio da b a p(che punta sul megabuffer) nbyte (appena arrivati che risiedono su b)
p=p+n; //sposto il puntatore in avanti di n bytes x nuovi dati...
}
ovviamente eseguo altri controlli vari...questo è un riassunto del codice...
il problema è che : in un thread il puntatore a carattere p NON viene modificato...ossia l'incremento e l'assegnazione non vengono considerati...(cosi' come SONO COSTRETTO a fare dei malloc, altrimenti la recv o send vanno in errore se eseguite in un thread)
cosa posso fare??? se li faccio girare come processo normale tutto liscio...ma coi thread? cosa è che NON SO ?