View Single Post
Old 03-07-2014, 00:08   #19
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Usa e poi scorda TCP. TCP ti assicura che il ricevente legga tutto come uno stream di bytes. Quando chiedi di leggere 4 bytes dalla socket, la funzione non ritorna finché non ha letto 4 bytes (più o meno, vedi meglio le eccezioni, esempio l'altro lato chiude la connessione).
Eh proprio per quello non capisco a cosa serva preoccuparmi del buffer , se tanto la recv aspetta fino a che non ho letto i 4byte e si blocca se il buffer è vuoto .
L'unico problema sarebbe se il buffer non è stato riempito per quanti byte mi aspettavo a quel punto la mia recv mi riporterà i byte letti che saranno in numero minore a quelli che mi aspettavo.
Per gestire questo problema potrei mettere un buffer che riempio mano a mano con la recv. Ma non mi riesce capire il , perchè ciò sia necessario.

Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Comunque ti conviene strutturare tutto in messaggi aventi un header del tipo:

Codice:
struct message_header
{
    uint32_t length;
    char variable_message[0]; // nn ricordo ma dovrebbe funzionare su C99
};
Quando allochi la memoria dinamicamente ti preoccupi di allocarne per

Codice:
sizeof(struct message_header) + lunghezza messaggio
Così facendo allochi lo spazio per la struttura header e per il messaggio.

A quel punto casti il puntatore restituito dalla malloc con uno struct message_header e puoi impostare sia length che accedere direttamente al messaggio (in questo esempio è solo un array variabile di bytes).

All'invio invierai tutto il contenuto della struttura puntata.

Alla ricezione leggerai dapprima sizeof(struct message), e poi da lì continuerai a leggere per quanti bytes ti dice il campo length...
Non ci avevo pensato a creare una struttura e poi inviare quella pezzo per pezzo, pensavo ad una cosa più da newbie tipo un buffer di char con un byte per dimensione , 1 byte per il comando , restante per il campo dati.

Devo capire come inviare una struttura
E poi devo capire un paio di chicche del codice che hai scritto
Dichiarando :
Codice:
"char variable_message[0];"
se io dopo voglio allocare una stringa come dovrei fare ? Facendo così alloco dinamicamente il vettore ? Cercando su internet non avevo mai trovato questa soluzione
L'ho provata ma dipende dove la metto e mi funziona in altri posti no, ora domani la provo meglio
[ mi do una letta qui : http://stackoverflow.com/questions/9...e-array-in-c-c ]

Grazie !!!

Ultima modifica di aeroxr1 : 03-07-2014 alle 00:33.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso