PDA

Visualizza la versione completa : [C/C++]: Trasferimento di oggetto attraverso socket


denis76
29-08-2006, 16:01
Sto sviluppando un programma scritto in c++ che lavora in rete per mezzo di socket.
Come è possibile trasferire un oggetto da un server ad un client?
E' possibile usare il protocollo rpc per tale cosa? Avete documentazione?

Grazie mille, Denis.

billiejoex
30-08-2006, 11:49
'Oggetto' in che senso? Dei dati? In tal caso è proprio alle socket che ti dovrai affidare, non ad RPC.

denis76
30-08-2006, 12:38
Mi riferisco ad un oggetto generico tipo


class Oggetto {

private:

protected:

public:
char a[256];
int b;
struct Ciccio {
int a;
}

}



Come faccio a spostarlo su e giù per la rete?

XWolverineX
30-08-2006, 13:08
Se intendi dire le proprietà di un oggetto (cio è ricordare ad un altro programma che una variabile è uguale a 3) basta che mandi l'oggetto convertito tramite socket e poi lo leggi.
Esempio teorico



//per mandare si usa la funzione send
send(sock,reinterptet_cast<void*>(&Cl1),sizeof(MiaClasse));


chi deve ricevere farà



MiaClasse Cls;
recv(sock,reinterpret_cast<void*>(&Cls),sizeof(MiaClasse));


In questo modo Cls sarà uguale a Cl1 anche se non sono nello stesso programma.

billiejoex
30-08-2006, 14:14
Se intendi dire le proprietà di un oggetto (cio è ricordare ad un altro programma che una variabile è uguale a 3) basta che mandi l'oggetto convertito tramite socket e poi lo leggi.
Io credo che lui intendesse l'oggetto vero e proprio (in questo caso una classe comprensiva di metodi).
Purtroppo non conosco C++. In python la cosa è fattibile tramite un modulo chiamato pickle che permette di convertire in byte stream l'oggetto e "riconvertirlo" allo stato originario. In pratica la soluzione ideale che servirebbe a te per spedirlo tramite socket.
Sicuramente qualcosa di simile sarà disponibile anche per C++.

denis76
30-08-2006, 14:53
Supponiamo che io lato server instanzi l'oggetto:

Oggetto *oggetto= new Oggetto();
oggetto->b= 12;

Ora voglio mandare al client l'oggetto *oggetto in modo che lui poi possa accedere alla variabile 'b' ed ottenere il valore che esso contiene (12). Come posso fare?

XWolverineX
30-08-2006, 15:04
Ti ho scritto sopra come si fa, anche se in modo sommario.
Mandi tramite socket all'altro pc l'oggetto in bytes e poi lo ricomponi.
Se non vuoi usare i socket puoi anche salvare l'oggetto su file.

denis76
30-08-2006, 23:15
Sto studiando la tua soluzione che mi sembra molto valida. Potresti indicarmi dove trovare maggioni informazioni su tale cosa? In particolar modo non mi è chiaro cosa significhi

<void*>

Esiste una tecnica per fare in modo che colui che riceve l'oggetto sia in grado di capire che oggetto esso sia?
Questa mia esigenza nasce dal fatto che non saprei come gestire la comunicazione prevedendo molti oggetti diversi tra loro.

Grazie mille, Denis.

scancode
31-08-2006, 00:00
Originariamente inviato da denis76
Sto studiando la tua soluzione che mi sembra molto valida. Potresti indicarmi dove trovare maggioni informazioni su tale cosa? In particolar modo non mi è chiaro cosa significhi

<void*>

Esiste una tecnica per fare in modo che colui che riceve l'oggetto sia in grado di capire che oggetto esso sia?
Questa mia esigenza nasce dal fatto che non saprei come gestire la comunicazione prevedendo molti oggetti diversi tra loro.

Grazie mille, Denis.

XWolverineX ti ha descritto come si fà giustamente.

posso aggiungere:
un'oggetto, come dati e quantaltro non sono altro che sequenze di byte.

Il client e il server riconoscono una struttura perchè chi progetta appunto il client e il server sà cosa si devono comunicare quindi...


sul client farai:
struct t_bikeData
{
t_matrixComp mat[3];
};
e altrettatnto sul server

sia dal client che dal server invii così:

t_bikeData data;
g_bike[idN].GetBikeData(&data);

un esempio di invio dei dati:

GAMEMSG_OKAY msgOkay;
msgOkay.Data = data;
strcpy(msgOkay.nome, NomePlayer);
msgOkay.b=b;
//invio
send (socket, (const char*) &msgOkay, sizeof(GAMEMSG_OKAY), 0);

//ricezione
char rec[512];
int bytes;
bytes = recv((SOCKET)wParam, rec, sizeof(GAMEMSG_OKAY), 0);
GAMEMSG_OKAY* pMsg = (GAMEMSG_OKAY*) &rec;
g_bike[x].SetBikeData(&pMsg->Data);
strcpy(CiaoFratello, msgOkay.nome);
a=msgOkay.b;

//naturalmente i dati inviati sono meno di 512 bytes


la struct GAMEMSG_OKAY te la faì da solo...



ciao

XWolverineX
31-08-2006, 08:48
Praticamente con il cast a char trasformi l'oggetto in un semplice flusso di byte e nella ricezione fai il contrario: flusso di byte a oggetto

Loading