Forum: PC-Programmierung C++: Serialisierung: Client/Server Kommunikation über Klassen Objekte


von Andre (Gast)


Lesenswert?

Hallo,

ich habe hier einen Client/Server Kommunikation in C++ auf einer 
Linux-Maschine gebastelt. Das funktioniert soweit ganz gut, Strings 
können hin und her geschickt werden.

Der nächste Schritt ist es Objekte über einen Socket zu verschicken.
Natürlich kann man Libraries wie zb. Boost einbinden, dass will ich aber 
gerne vermeiden.

Anhand dieses Beispiels, ist die Serialisierung gut zu verstehen:
http://www.functionx.com/cpp/articles/serialization.htm

Wo es bei mir hängt, ist:
Wie wird einem Socket ein Stream übergeben?
Wie sieht der Funktionsaufruf von recv und send aus, wenn man Objekte 
über Sockets verschicken will.

Danke
Andre

von functiony (Gast)


Lesenswert?

Andre schrieb:
> Wo es bei mir hängt, ist:
> Wie wird einem Socket ein Stream übergeben?

Mittels send

> Wie sieht der Funktionsaufruf von recv und send aus, wenn man Objekte
> über Sockets verschicken will.

Du serialisierst die Objekte in einen Stream und übergibst den Stream 
dem Socket.

Anhand dieses Beispiels, ist die Serialisierung gut zu verstehen:
http://www.functionx.com/cpp/articles/serialization.htm

von Rolf Magnus (Gast)


Lesenswert?

functiony schrieb:
> Andre schrieb:
>> Wo es bei mir hängt, ist:
>> Wie wird einem Socket ein Stream übergeben?
>
> Mittels send
>
>> Wie sieht der Funktionsaufruf von recv und send aus, wenn man Objekte
>> über Sockets verschicken will.
>
> Du serialisierst die Objekte in einen Stream und übergibst den Stream
> dem Socket.

Was meinst du mit "übergibst den Stream dem Socket"? Der Stream muss 
seine Daten in den Socket schreiben. Man müßte sich also eine eigene 
Stream-Klasse bauen, die in den Socket schreibt.
Eine Alternative wäre noch, einen stringstream zu benutzen, damit alles 
in einen String zu schreiben und dann dessen Inhalt an den Socket zu 
übergeben.

von Andre (Gast)


Lesenswert?

Aufbauend auf dem Bsp:
http://www.functionx.com/cpp/articles/serialization.htm

habe ich exemplarisch die send-Methode mit Stream versehen.
Das schein jedoch nicht zu klappen.

1
bool Socket::send ( const std::ofstream ofs ) const
2
{
3
  int status = ::send ( m_sock, ofs, sizeof(ofs), MSG_NOSIGNAL );
4
  if ( status == -1 )
5
    {
6
      return false;
7
    }
8
  else
9
    {
10
      return true;
11
    }
12
}

von functiony (Gast)


Lesenswert?

Andre schrieb:
> Das schein jedoch nicht zu klappen.

Dann muss du den Fehler beheben.

von Andre (Gast)


Lesenswert?

functiony schrieb:
> Andre schrieb:
>> Das schein jedoch nicht zu klappen.
>
> Dann muss du den Fehler beheben.

Ich will wissen wie man, dem Socket das std::ofstream ofs übergeben 
kann.
Dann kann ich auch den Fehler beheben.

von functiony (Gast)


Lesenswert?

Andre schrieb:
> Ich will wissen wie man, dem Socket das std::ofstream ofs übergeben
> kann.

Gar, nicht.

> Dann kann ich auch den Fehler beheben.

Ist dir überhaupt klar, von welchem Fehler du redest? Warum verrätst du 
es dann nicht?

von functiony (Gast)


Lesenswert?

Andre schrieb:
> Ich will wissen wie man, dem Socket das std::ofstream ofs übergeben
> kann.
> Dann kann ich auch den Fehler beheben.

Da es anscheindend ein Geheimnis ist, welchen Fehler du beheben willst, 
musst du das alleine tun. Kriegst du aber sicher hin, denn:

> Anhand dieses Beispiels, ist die Serialisierung gut zu verstehen:
> http://www.functionx.com/cpp/articles/serialization.htm

Wenn alles gut zu verstehen ist, kann man sich aber auch das Fragen 
sparen.

von Andre (Gast)


Lesenswert?

functiony schrieb:
> Andre schrieb:
>> Ich will wissen wie man, dem Socket das std::ofstream ofs übergeben
>> kann.
>> Dann kann ich auch den Fehler beheben.
>
> Da es anscheindend ein Geheimnis ist, welchen Fehler du beheben willst,
> musst du das alleine tun. Kriegst du aber sicher hin, denn:
>
>> Anhand dieses Beispiels, ist die Serialisierung gut zu verstehen:
>> http://www.functionx.com/cpp/articles/serialization.htm
>
> Wenn alles gut zu verstehen ist, kann man sich aber auch das Fragen
> sparen.

Also die Fehler Ausgaben sind so durcheinander, dass sie hier nicht 
geholfen hätten.


Ich hatte an sowas gedacht:
Quelle: 
http://stackoverflow.com/questions/3261227/how-to-serialize-an-object-to-send-over-network
1
class Object {
2
public:
3
int a;
4
string b;
5
6
void methodSample1 ();
7
void methosSample2 ();
8
9
friend ostream& operator<< (ostream& out, Object& object) {
10
out << object.a << " " << object.b;   //The space (" ") is necessari for separete elements
11
return out;
12
}
13
14
friend istream& operator>> (istream& in, Object& object) {
15
in >> object.a;
16
in >> object.b;
17
return in;
18
}
19
};
20
21
/* Server side */
22
int main () {
23
Object o;
24
stringstream ss;
25
o.a = 1;
26
o.b = 2;
27
ss << o;    //serialize
28
29
write (socket, ss.str().c_str(), 20); //send - the buffer size must be adjusted, it's a sample
30
}
31
32
/* Client side */
33
int main () {
34
Object o2;
35
stringstream ss2;
36
char buffer[20];
37
string temp;
38
39
read (socket, buffer, 20);  //receive
40
temp.assign(buffer);
41
ss << temp;
42
ss >> o2;   //unserialize
43
}

Trotzdem Danke.

von functiony (Gast)


Lesenswert?

Andre schrieb:
> Ich hatte an sowas gedacht:

Denken ist immer ganz schlecht, wenn man sich mit etwas beschäftigt, 
wovon man keine Ahnung hat. Wenn man dann noch denkt, dass alle anderen 
Gedankenlesen können, hat man so ungefähr die Probleme, die du dir hier 
bereitest.

Andre schrieb:
> Trotzdem Danke.

Bitte, kommt nicht wieder vor.

von Rolf Magnus (Gast)


Lesenswert?

functiony schrieb:
> Andre schrieb:
>> Ich will wissen wie man, dem Socket das std::ofstream ofs übergeben
>> kann.
>
> Gar, nicht.

Wobei du ihm ja vorher genau das geraten hast.

Andre schrieb:
> Also die Fehler Ausgaben sind so durcheinander, dass sie hier nicht
> geholfen hätten.

Naja, keine Fehlerausgaben helfen noch weniger als welche, die 
"durcheinander" sind.

> Ich hatte an sowas gedacht:

Und welches Problem hast du damit? Das enstpricht übrigens der 
Alternative, die ich angesprochen hatte.

von Andre (Gast)


Lesenswert?

functiony schrieb:
> Andre schrieb:
>> Ich hatte an sowas gedacht:
>
> Denken ist immer ganz schlecht, wenn man sich mit etwas beschäftigt,
> wovon man keine Ahnung hat. Wenn man dann noch denkt, dass alle anderen
> Gedankenlesen können, hat man so ungefähr die Probleme, die du dir hier
> bereitest.
>
> Andre schrieb:
>> Trotzdem Danke.
>
> Bitte, kommt nicht wieder vor.




Rolf Magnus schrieb:
>> Ich hatte an sowas gedacht:
>
> Und welches Problem hast du damit? Das enstpricht übrigens der
> Alternative, die ich angesprochen hatte.



Es ging um keine Fehleranalyse. Ich wollte nur eine Möglichkeit, ein 
Objekt zu serialisieren, was man einem Socket übergeben kann.
Da hat der Hinweis von Rolf bzgl. des Stringstreams geholfen.
Mehr war nicht gefragt.

Warum functiony sich aufregt, verstehe ich nicht.
Wenn man so eine Schärfe eine technische Diskussion rein bringt, sollte 
man lieber die Finger von der Tastatur lassen. Mein bescheidene 
Meinung...;)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Andre schrieb:
> Der nächste Schritt ist es Objekte über einen Socket zu verschicken.
> Natürlich kann man Libraries wie zb. Boost einbinden, dass will ich aber
> gerne vermeiden.

Warum? Mit Boost bekommst Du fantastilionen an Qualitätslibraries, die 
zumindest Network-IO und Serialization schon mal mitbringen.

> bool Socket::send ( const std::ofstream ofs ) const
> {
>   int status = ::send ( m_sock, ofs, sizeof(ofs), MSG_NOSIGNAL );

Wie Rolf schon schrieb, solltest Du Dir Deinen eigenen stream um den 
Socket her schreiben. Genau genommen ist es sogar der stream buffer, den 
Du selbst schreiben musst (es sei den, Du verwendest Boost.ASIO).

Streams führen in C++ einen Zustand mit sich. Vor dem Schreiben, kann 
man aus Effektivitätsgründen prüfen, ob der Stream noch in Ordnung ist. 
Wenn man bei der Verwendung des Streams auf einen Fehler läuft, dann 
ändert man den Status des Stream.

>   if ( status == -1 )
>     {
>       return false;
>     }
>   else
>     {
>       return true;
>     }
> }

Schöne Form von `bool to bool` Konvertierung! Würde ich ein eine 
Funktion auslagern ;-)

mfg Torsten

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.