Newsgroup: it.comp.lang.c
Titolo: Scambio dati tramite socket in binario puro

Salve a tutti, ho un piccolo quesito da porvi.
Tramite socket io dovrei inviare dati in binario pure, come devo fare? Io 
sono riuscito ad inviare stringhe ascii, passo alla write il bufer e la 
lunghezza e lui scrive. Ora dovrei inviare numeri in formato di rete in 
binario puro. A quanto ho capito dovrei direttamente scrivere sul socket il 
numero in formato di rete, poi dovrei ricevere il numero in un buffer e 
copiare quello che ho ricevuto in un'opportuna variabile con memcpy. Ho 
capito, in linea di massima, come inviare e ricevere dati in binario puro?
Grazie, ciao ciao. 

Tramite socket io dovrei inviare dati in binario pure, come devo fare?
Non capisco dove sia il problema.  A parte che "binario puro" non vuol
dire nulla, i socket lavorano già con dati binari.  Inviare un dato
binario significa spedire, a partire da &tua_variabile, per
sizeof(tua_variabile).

 ha scritto nel messaggio 
news:2bm8221nlerirc3o9...@4ax.com...

Ok ti ringrazio, ora però ho un piccolo problema. Io devo inviare 3 
variabili numeriche in formato di rete. Due sono uint8_t ed una è uint16_t. 
Devo quindi inviare tassativamente 4 byte. Ora se io applico htons ai due 
dati uint8_t mi viene ritornato un uint16_t e se faccio il cast ad uint8_t 
il valore non è più quello corretto. Come posso fare?Poi dato che io invio 
queste 3 variabili una dietro l'altra per riceverle mi basta una semplice 
read?
Io ho provato e mi viene letta solo la prima variabile inviata senza 
attendere l'arrivo delle altre.
Se poi voglio inviare quelle variabili tutte insieme in un unico buffer come 
dovrei fare?
Grazie, ciao ciao. 

 Giovanni
Grazie per l'aiuto sono riuscito ad inviare i dati solo che ho un
piccolo problemino. Io invio la struttura al server che effettivamente
riceve 4 byte, poi cerco di far rispondere il server e invio una
struttura con un byte che indica lo stato e due bytes che indicano il
risultato di un'operazione, solo che quando invio i dati la struttura
mi viene detto che è composta da 4 byte e non da 3 byte come dovrebbe
essere. Un'altra cosa, il mio client dopo aver inviato i dati dovrebbe
rimanere in attesa di una risposta dal server solo che mi viene
lanciato un errore di segmentation fault.
Un'altra cosa se io volessi inviare i dati al server scrivendo 3 write
es:
write(socket, primoByte, sizeof(primoByte));
write(socket, secondoByte, sizeof(secondoByte));
write(socket, ultimi2Byte, sizeof(ultimi2oByte));
Nel server cosa dovrei mettere per leggere tutti e 4 i byte?
Una semplice n=Read(socket,rbuf,MAXBUFF) non funziona, mi legge solo il
primo byte. Come dovrei modificare il server per far ricevere sia i
byte inviati in questo modo che quelli inviati con una struttura? Il
client che sto scrivendo io è solo un "emulatore" per un client che
non ho ma di cui ho solo le specifice sul protocollo di comunicazione.
Ti allego le parti che mi danno problemi.
Server:
	uint16_t ris = sqrtn(base2, radice); //effettuo l'operazione radice
n-esima
	ris=htons(ris); // converto il risultato in formato di rete
	struct risposta{uint8_t uris; uint16_t risultato;} dati; //definisco
la struttura (dovrebbe essere 3 byte)
	dati.uris=0; //imposto lo stato
	dati.risultato=ris; //assegno risultato
	#ifdef TRACE
            err_msg("La dimensione dello stato è: %u\n",
sizeof(dati.uris)); //mi viene dato 1
	    err_msg("La dimensione del risultato è: %u\n",
sizeof(dati.risultato)); //mi viene dato 2
            err_msg("La dimensione della risposta è: %u\n",
sizeof(dati)); //mi viene dato 4?? Io devo rispondere per forza con 3
byte
      	#endif
       Writen(connfd, &dati, sizeof(dati)); //invio i dati
Client:
invio.radice=3; //imposto i dati della struttura che invio
invio.dim=sizeof(pippo);
invio.operando=pippo;
#ifdef TRACE
    err_msg("Dati inviati: %u\n", sizeof(invio));//la dimensione della
struttura qua è correttamente 4
#endif
Writen(socket,&invio,sizeof(invio)); //invio la struttura
//qua mi viene dato segmentation fault, cosa posso avere sbagliato?
n=Read(socket,rbuf,MAXBUFF);
Grazie, ciao ciao.