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
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
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.
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 | }
|
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.
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?
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.
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.
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.
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.
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...;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.