C++, Wie kann ich senden Sie ein Objekt via socket?
Ich habe eine Frage für Sie.
Habe ich diese Klasse:
`
#define DIMBLOCK 128
#ifndef _BLOCCO_
#define _BLOCCO_
class blocco
{
public:
int ID;
char* data;
blocco(int id);
};
#endif
blocco::blocco(int id)
{
ID = id;
data = new char[DIMBLOCK];
}
`
und die Anwendung ist ein client und ein server.
In der Hauptsache von meinem server instanziiere ich ein Objekt dieser Klasse in dieser Weise:
blocco a(1);
Nach, dass ich eine Verbindung zwischen client und server über sockets.
Die Frage ist: wie kann ich senden Sie dieses Objekt vom server zum client oder Umgekehrt?
Könnten Sie mir bitte helfen?
Socket code wird wahrscheinlich erforderlich sein. Und selbst dann, es sei denn, du bist der Einrichtung eines aufwendigen RPC-system, das beste, was Sie bekommen ist eine kopieren (die kann alles, was Sie brauchen).
InformationsquelleAutor rosekarma | 2013-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist unmöglich, senden Sie Objekte über eine TCP-Verbindung im eigentlichen Sinne. Steckdosen nur wissen, wie zu übertragen und zu empfangen einen Strom von bytes. Also, was Sie tun können, ist senden Sie eine Serie von bytes über die TCP-Verbindung, formatiert, so dass das empfangende Programm weiß, wie Sie zu interpretieren, und erstellen ein Objekt, das identisch zu dem, das senden Programm senden wollte.
Das Verfahren nennt sich Serialisierung (und Deserialisierung auf der Empfängerseite). Serialisierung ist nicht in der Sprache C++ selbst, so müssen Sie einige code, um es zu tun. Es kann von hand gemacht werden, oder über XML oder über die Google Protocol Buffers, oder durch die Umwandlung der Objekt-bis zu menschlich-lesbaren-text und sendet den text, oder eine Reihe von anderen Möglichkeiten.
Haben Sie einen Blick hier für mehr info.
Nein. Das wird nicht funktionieren, aus mehreren Gründen... zum einen, es nicht Folgen Zeiger (z.B. der Empfänger einer blocco, die gesendet wurde, die Möglichkeit erhalten würden, der Wert der (Daten) - Zeiger eher als Zeichen, dass (Daten -) Punkte, die nicht nützlich). Es ist auch nicht richtig behandeln Polsterung und endian-ness Probleme.
Was gut wäre zu tun? Wie würden Sie code schreiben, um die Daten zu empfangen gegeben, dass Sie haben buchstäblich keine Ahnung, was die bytes, die Sie geschickt hatte. Code schreiben, um die Daten zu empfangen, die erste Sache, die Sie brauchen, um zu wissen, wie viele bytes die ID-Codierung. Aber Sie wissen gar nicht, dass -- und, schlimmer noch, es wird sich ändern, wenn Sie ändern Sie die compiler-Plattform, etcetera.
InformationsquelleAutor Jeremy Friesner
können Sie dies tun, indem Sie Serialisierung. Dies bedeutet, ziehen Objekts in Stücke, so dass Sie senden können diese Elemente über die Steckdose. Dann müssen Sie rekonstruieren Ihre Klasse in der anderen Ende der Verbindung. in Qt gibt es Klasse QDataStream verfügbar die Bereitstellung solcher Funktionen. In Kombination mit einem QByteArray Sie können erstellen Sie ein Daten-Paket, das Sie senden können. Die Idee ist einfach:
Absender:
Empfänger:
Nun möchten Sie vielleicht, um zusätzliche Konstruktor:
erweitertes Beispiel
InformationsquelleAutor 4pie0
Ich weiß nicht, wie viel flak werde ich dafür bekommen, aber nun, ich versuchte dies und obwohl ich sollte es teilen. Ich bin ein Anfänger bei socket-Programmierung also nicht stinksauer zu werden.
Was ich habe ist, dass ich erstellt ein array von Zeichen, die von der Größe der Klasse (die den block des Speichers der server-Seite). Dann habe ich
recv
ed den Speicherblock, der auf der client-Seite und festgelegt, dass block des Speichers als ein Objekt und voila!! Ich schaffte es ein Objekt senden von client zu server.Beispielcode:
Können Sie jetzt tun, was immer Sie wollen mit diesem Daten mit diesem als ein Zeiger auf das Objekt. Nur denken Sie daran, nicht versuchen zu löschen/free this-Zeiger wie dieser Speicher zugeordnet ist, um die array-blockOfData, die auf dem Stapel.
Hoffe, dies hilft, wenn Sie wollte etwas umsetzen, wie diese.
PS: Wenn Sie denken, was ich getan habe, ist schlechter Programmierstil bitte lassen Sie mich wissen, warum. Ich weiß nicht, warum das so eine schlechte Idee(wenn es ist in der Tat eine schlechte Idee, dies zu tun). Danke!!
Implementiert habe ich dies auf meinem macbook und lief sowohl auf dem client und server auf der gleichen Maschine. Ich war erfolgreich in der Lage, auf die Daten zuzugreifen, und nicht irgendwelche Abstürze/Müll-Wert Problem. Vielleicht, wenn ich versuche dies über mehrere Systeme mit unterschiedlichen endian Systemen werde ich ein problem haben?
Ich bekomme dein Punkt jetzt, wenn ich die Zeiger, ich werde bei der Bewältigung dieser Probleme. Obwohl, wenn ich einen string (den hab ich in meinem code), dann werde ich nicht diese Probleme.
Die meisten string-Klassen enthalten einen Zeiger intern, so dass Sie wahrscheinlich immer noch vor, dass Problem. Auch wenn Sie nicht, aber Sie würde immer noch mit der anderen Probleme (endian-ness Unterschiede, Wort-Größe Unterschiede, struct-Polsterung Unterschiede), außer unter bestimmten Umständen (d.h. außer wenn sowohl das sendende und das empfangende Programm kompiliert wurden für die gleiche CPU-Architektur und das gleiche OS mit den gleichen compiler mit den gleichen Einstellungen)
vielen Dank für diesen Hinweis. Schätzen Sie es!! 😀
InformationsquelleAutor Siddharth Gupta