|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[Visual C++] Passare "float" come dati con socket
Salve a tutti.
Sto cercando di imparare ad utilizzare le socket per la comunicazione tra due PC. Tutti gli esempi che ho trovato fin'ora, sono tutti di scambio di messaggi tra socket, messaggi di tipo char (con dimensione conosciuta a priori o no). Ma come si fa a passare dei "float" ad una socket? Se devo inviare un insieme di dati del tipo 0.0099 0.23344 0.55532 0.00001 0.02223 0.4522 0.2333 0.666 0.00000 come devo fare per fare in modo che dall'altra parte arrivino in quel modo (cioè che sia riconoscibile quando finisce un valore e comincia un altro valore)? posso usare sempre un buffer "char" per inviare quei valori? Alla fine sono caratteri anche i numeri...solo che non mi è chiaro come fare per distinguere ogni valore dall'altra parte...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Per utilizzare gli spazi come una sorta di token, sapresti darmi una dritta?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12904
|
Quote:
Codice:
#include <stdint.h>
typedef struct float_buffer_head
{
int32_t length;
float data[0];
} float_buffer_head;
A questo punto lato invio: Codice:
int32_t N = 10; float_buffer_head* my_data = (float_buffer_head*) malloc( sizeof(float_buffer_head) + N*sizeof(float)); my_data->length = N; // ciclo per riempire my_data->data ... // invio send(my_data); Codice:
int32_t items = 0; read(&items, sizeof(int32_t)); // leggi il numero di items dalla socket // controlla che il numero di items sia valido ... // alloca la memoria float_buffer_head* my_data = (float_buffer_head*) malloc( sizeof(float_buffer_head) + items*sizeof(float)); // leggi dalla socket read(&my_data->data, items*sizeof(float)); ATTENZIONE: il codice seguente NON E' PORTABILE. E' necessario, dal punto di vista dell'endianess delle varie architetture, che gli int e i float vengano convertiti in network byte order e viceversa). Il codice tuttavia è abbastanza compatto ed efficiente. E' da un po' che non programmo C puro, quindi non ricordo alcuni dettagli, ad esempio mi pare che non tutti i compilatori C supportano la sintassi: Codice:
float data[0]; La size del campo è 0, quindi se fai sizeof() di una struttura che contiene quel campo ovviamente esso non viene conteggiato. PS: nota che essendo i float tutti lunghi 4 bytes, non è necessario un delimitatore, è sufficiente leggere 4 bytes alla volta. Se avessi avuto dati di lunghezza variabile (ad esempio stringhe) avresti dovuto fare diversamente. Ultima modifica di WarDuck : 30-03-2014 alle 13:58. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Intel, ARM, e pure MIPS sono little endian, little endian ha vinto da una buona decina d'anni. Personalmente, non sprecherei performance e memoria su una cosa che e' del tutto inutile.... butta i dati nel socket cosi' come sono Allo stesso modo, se tutti i client supportano IEEE 754 (hint: probabilmente si e anche bene) puoi mandare i float cosi' come sono. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
EDIT: Alla fine devo proprio passare una struct via socket...e a quanto pare, funziona tranquillamente. Grazie a tutti per le dritte.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 05-05-2014 alle 10:26. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:34.




















