PDA

Visualizza la versione completa : [C] Invio dati su socket: messaggio composto da header e corpo


vonkraun
02-07-2012, 18:20
Ciao a tutti,
devo creare un client che invii al server, tramite socket, un messaggio contenente un header e un corpo.
L'header è composto per i primi 16 byte da tutti 1 (e quindi 128 bit a 1). Come faccio ad inviare questi, tramite un buffer, dato che il buffer usato dalla send() è di tipo char * ?

oregon
02-07-2012, 18:39
Dove sta la difficoltà che incontri nel tuo codice? Hai provato a scriverlo?

vonkraun
03-07-2012, 13:49
Originariamente inviato da oregon
Dove sta la difficoltà che incontri nel tuo codice? Hai provato a scriverlo?
Beh, non sapendo come salvare 16 byte a 1 nel buffer no, ma suppongo debba essere qualcosa del tipo

buf="1111111111111111111111"; //128 bit a 1 buf[17]='\0'; result = send(s, buf, strlen(buf), 0);

Anche se ovviamente il contenuto di buf[] non è quello corretto, perchè in questo modo non pongo 128 bit a 1.

oregon
03-07-2012, 14:34
16 byte con tutti i *bit* a 1 vuol dire che ogni byte è uguale a 255 ...

Quindi



char buf[16];

memset(buf, 255, 16);

...

result = send(s, buf, 16, 0);

pontius298
03-07-2012, 15:32
Grazie per la condivisione!
http://www.####################/kv.gif

vonkraun
05-07-2012, 23:18
Approfitto del topic per chiedere un'altra cosa sempre riguardante l'invio di messaggi su socket.

Nell'header del messaggio da inviare dal mio client al server, c'è un campo lungo 2 byte che rappresenta la lunghezza. Questo campo è espresso in byte e rappresentato in network byte order.

Su due piedi direi che basterebbe, per poter inviare questo campo tramite il buffer di tipo char * della send(), porre la lunghezza del messaggio come stringa.
ad esempio char buf "13" e inviarla con la send: result = send(s, buf, strlen(buf), 0).
Invece in questo modo non sarebbe in network byte order e quindi bisognerebbe trasformarlo in una variabile di tipo uint16_t tramite la inet_aton(), passandogli la stringa e una struttura in_addr *.
Il problema è che ora, questo numero in binario deve andare nel famoso buffer utilizzato dalla send(). Ma come fare?

Il professore ci ha detto che quei due bytes rappresentano un numero binario su 16 bit che a loro volta devono essere convertiti in network byte order per poter essere trasmessi. Quindi non si può parlare di sicuro di caratteri ascii da inviare.
Ma l'interpretazione è abbastanza difficile, almeno per me.

Chi può aiutarmi?

oregon
05-07-2012, 23:32
Non ho capito bene ... dove sono questi due byte? Perché li devi inserire nel buffer ? Non puoi inviarli e basta?

vonkraun
06-07-2012, 10:57
Originariamente inviato da oregon
Non ho capito bene ... dove sono questi due byte? Perché li devi inserire nel buffer ? Non puoi inviarli e basta?

Questi due byte fanno parte del messaggio che devo inviare. Siccome so com'è strutturato, posso permettermi di inviare un tot di byte alla volta (ad esempio prima dei byte che identificano la lunghezza c'è un altro campo, quindi invio prima quello).
Li devo inserire nel buffer perchè è l'unico modo per inviarlo con la send, che infatti riceve come parametri int socket, char *buffer, int datalen, int flags. C'è un modo per "inviarli e basta"?

oregon
06-07-2012, 11:15
Il "buffer" è un concetto estendibile a qualsiasi zona di memoria, compresi i due byte in questione ...

Se hai una variabile numerica (short 2 byte) la puoi inviare a partire dal suo indirizzo in memoria ...

vonkraun
06-07-2012, 11:18
Originariamente inviato da oregon
Il "buffer" è un concetto estendibile a qualsiasi zona di memoria, compresi i due byte in questione ...

Se hai una variabile numerica (short 2 byte) la puoi inviare a partire dal suo indirizzo in memoria ...

Scusa me se il buffer è un vettore di caratteri, non sono obbligato a portare i miei due byte in un vettore di caratteri? Altrimenti che senso avrebbe ricevere come parametro un char * ?

Loading