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.
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
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