|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2006
Messaggi: 31
|
[c++] come inviare dati con winsock??
Ciao a tutti,
Ho fatto un piccolo programmino client server.... il client si connette al server e tramite la funzione send(socket s ,const char* buff,int size_buff,int flag) io riesco a inviare delle stringhe. Il problema è che io vorrei che il client inviasse al server delle strutture dati. la struttura che vorrei inviare è fatta da 4 interi. Codice:
Typedef struct{ int a; int b; int c; int d; }pippo; pippo struttura_prova; |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Devi serializzare la tua struttura e poi pensare anche al protocollo di comunicazione.
Come fa il server a sapere quando sono finiti i dati inviati? Come riconosce l'inizio di una trasmissione dati? Come riconosce cosa gli è stato inviato? Ad esempio potresti voler inviare 2 strutture differenti e a quel punto non sapresti più come distinguerle. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Mar 2006
Messaggi: 31
|
non devo serializzare i dati.
devo mandargliene solo 1 e poi chiudere la connessioe. non ho altro da inviare. solo che non so come inviare una struttura |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ti consiglio una ripassata al signiifcato di serializzazione:
http://en.wikipedia.org/wiki/Serialization Quote:
Codice:
send(socket, (char*)&struttura_prova, sizeof(pippo)) |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mai chiamare "socket" un socket descriptor: collide col nome della funzione socket; 'si sa mai dovessi avere la necessità di prendere il puntatore alla funzione anziché il valore del socket descriptor.
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Mar 2006
Messaggi: 31
|
ok funziona
![]() avrei un altro problemino.... nell'invio di più messaggi...cioè se : client : send(dato1)....send(dato2) server : recv(buff)....recv(buff) dopo la seconda recv in buff mi trovo ancora dato1 e non dato2 :|. il problema lìho risolto in questo modo : client : send(dato1)... recv(miobuff) .... send(dato2) server : recv(buff) .... send ("ok") .... recv(buff) volevo sapere se non fosse possibili fare delle send(lato client) e recv(lato server) consecutive senza dover mandare questi messaggi di "sincronizzazione" ... "ok". |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2007
Città: Messina
Messaggi: 502
|
Solo un avviso: non inviare mai direttamente strutture del C: diversi compilatori (o stesso compilatore con diverse opzioni) hanno diverse regole per l'allineamento dei membri della struct. Praticamente qualche compilatore ti potrebbe inserire byte fra un membro e l'altro che non ti aspetti di trovare ;-) . Insomma, ti conviene inviare singolarmente i membri della struct anziché la struct per intero. Sì, è scomodo.
|
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Mar 2006
Messaggi: 31
|
ma la domanda era.... non posso fare due send consecutive dal client e due recive consecutive lato client??.... perchè nella seconda recive ricevo sempre il dato inviato con la prima send?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:33.