View Full Version : [c++] come inviare dati con winsock??
billybilly
16-07-2008, 12:30
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.
Typedef struct{
int a;
int b;
int c;
int d;
}pippo;
pippo struttura_prova;
come faccio ad iviare al server la struttura prova?? che funzione dovrei usare??
tomminno
16-07-2008, 13:09
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.
billybilly
16-07-2008, 13:13
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
tomminno
16-07-2008, 14:05
non devo serializzare i dati.
Ti consiglio una ripassata al signiifcato di serializzazione:
http://en.wikipedia.org/wiki/Serialization
devo mandargliene solo 1 e poi chiudere la connessioe. non ho altro da inviare. solo che non so come inviare una struttura
Potresti provare con:
send(socket, (char*)&struttura_prova, sizeof(pippo))
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.
billybilly
16-07-2008, 15:50
ok funziona :D...
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".
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.
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. più che altro gli conviene allineare le struct al singolo byte, così il compilatore non farà nessun padding e le strutture potranno essere trasmesse cross-compiler (cioè "cross - applicazioni compilate da compilatori diversi", scusate la cacofonia).
billybilly
17-07-2008, 10:00
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?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.