Quote:
Originariamente inviato da WarDuck
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
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 !!!