HTML.it è il sito italiano del web publishing

[C] Invio dati su socket: messaggio composto da header e corpo



scegli un altro forum
    Indietro   Ricarica   Avanti Invia una risposta

Autore
Discussione     
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ:

MSN:

Skype:


[C] invio dati su socket
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 * ?

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 02-07-2012 16:20
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


Dove sta la difficoltà che incontri nel tuo codice? Hai provato a scriverlo?


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 02-07-2012 16:39
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


Citazione:
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
codice:
     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.

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 03-07-2012 11:49
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


16 byte con tutti i *bit* a 1 vuol dire che ogni byte è uguale a 255 ...

Quindi

codice:
char buf[16];

memset(buf, 255, 16);
        
...

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


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 03-07-2012 12:34
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
pontius298
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 2


ICQ :

MSN :

Skype :


Grazie per la condivisione!

Segnala ad un moderatore | IP: Collegato | Permalink

pontius298 è offline Old Post 03-07-2012 13:32
Clicca qui per vedere il profilo dell'utente pontius298 Clicca qui per inviare all'utente pontius298 un messaggio privato Visualizza ulteriori messaggi scritti dall'utente pontius298 Aggiungi l'utente pontius298 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


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?

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 05-07-2012 21:18
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


Non ho capito bene ... dove sono questi due byte? Perché li devi inserire nel buffer ? Non puoi inviarli e basta?


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 05-07-2012 21:32
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


Citazione:
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"?

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 06-07-2012 08:57
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


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 ...


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 06-07-2012 09:15
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


Citazione:
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 * ?

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 06-07-2012 09:18
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


Mostra la variabile in questione nel tuo codice ...


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 06-07-2012 10:08
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da vonkraun
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 * ?

codice:
struct in_addr * buffer;
char * buf="19"; 
a = inet_aton(buf, buffer)
result = send(s, buffer->s_addr, strlen(buf), 0);     
if (result<strlen(buf)) return -1;


ad esempio 19 sta a rappresentarmi il numero di byte che costituiscono il messaggio da inviare. Devo inviare questo numero al server.

Tra l'altro mi sono appena reso conto che non posso nemmeno utilizzare la inet_aton() in questo caso dato che la struttura di tipo in_addr contiene una variabile su 32 bit e non su 16 come servirebbe a me. Quindi mi servirebbe anche una funzione che da char* me lo porti in uint16_t.

E poi c'è l'errore all'interno della funzione send(), come spiegavo nei post precedenti, poichè buffer->s_addr è un intero in network byte order su 32 bit e non un char *, come vuole il prototipo della funzione send().

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 06-07-2012 10:52
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
oregon
Utente di HTML.it



Registrato il: Jul 2005

Provenienza: Roma

Messaggi: 30822


ICQ :

MSN :

Skype :


Allora ... ti faccio un esempio e ne parliamo ...

Se hai una variabile (ad esempio, a 32 bit)

int a = 19;

la invii semplicemente con

send(s, (char *)&a, sizeof(a), 0);


__________________
La guida di VB6 ... usala!
Se cerchi una API ...
No MP tecnici (non rispondo nemmeno!), usa il forum.

Segnala ad un moderatore | IP: Collegato | Permalink

oregon è offline Old Post 06-07-2012 13:36
Clicca qui per vedere il profilo dell'utente oregon Clicca qui per inviare all'utente oregon un messaggio privato Visita l'homepage dell'utente oregon Visualizza ulteriori messaggi scritti dall'utente oregon Aggiungi l'utente oregon alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
vonkraun
Utente di HTML.it



Registrato il: Jul 2012

Provenienza:

Messaggi: 40


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da oregon
Allora ... ti faccio un esempio e ne parliamo ...

Se hai una variabile (ad esempio, a 32 bit)

int a = 19;

la invii semplicemente con

send(s, (char *)&a, sizeof(a), 0);


non avevo pensato al casting, devo verificare si possa fare. Per ora grazie

Segnala ad un moderatore | IP: Collegato | Permalink

vonkraun è offline Old Post 06-07-2012 14:33
Clicca qui per vedere il profilo dell'utente vonkraun Clicca qui per inviare all'utente vonkraun un messaggio privato Visualizza ulteriori messaggi scritti dall'utente vonkraun Aggiungi l'utente vonkraun alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Tutte le ore sono con fuso orario CET. Ora sono le 06:04.     

    Ultima discussione   Prossima discussione Invia una risposta
Versione per la stampa | Invia il thread via email | Ricevi aggiornamenti sul thread | Scarica il thread
 

Cerchi un argomento specifico e hai fretta? Usa il motore di ricerca