Kommunikation mit Java-Server
-
Klar können wir, aber wir können nichts dafür, wenn dir diese Lösungen nicht gefallen.
Aber da du soviel Wert auf die Stream-Operatoren legst:
class JavaNumber { int val; public: JavaNumber(int v) : val(v) {} operator int() {return val;} }; ostream& operator<<(ostream& s,const JavaNumber& v) { s.write((char*)&v,sizeof(v)); return s; } istream& operator>>(istream& s,JavaNumber& v) { s.read((char*)&v,sizeof(v)); return s; }
-
So könnte es gehen:
class BinaryOStream { public: virtual void write(const void* mem, std::streamsize size)=0; virtual bool is_open()=0; virtual void close()=0; virtual bool fail()=0; BinaryOStream& operator<<(char v) { write(&v, sizeof(v)); return *this; } BinaryOStream& operator<<(short v) { // Vertauschen der beiden Bytes hier write(&v, sizeof(v)); return *this; } ... // für alle in Frage kommenden Typen operator << definieren }; class BinaryOFStream : public BinaryOStream { private: std::ofstream m_stream; // oder eben ein anderer Stream public: BinaryOFStream([s]const std::string&[/s]const char* name) { m_stream.open(name[s].c_str()[/s],std::ios::out|std::ios::binary); } void write(const void* mem, std::streamsize size) { m_stream.write(reinterpret_cast<const char*>(mem), size); } bool is_open() { return m_stream.is_open(); } void close() { m_stream.close(); } bool fail() { return m_stream.fail(); } };So mehr oder weniger übernommen aus dem C++ Codebook.
-
Sieht schon mal gut aus

Wenn jetzt nicht noch eine salomonische Lösung kommt, übernehm ich das so
-
Planänderung. Da das ganze auf Mac OS laufen soll (wo ich boost einfach nicht zum laufen bekomme) muss ich sowieso meine eigene Socketklasse schreiben. Die Mühe eines Streams mache ich mir aber nicht. Zumindest keinen Standardkonformen.
Allerdings habe ich ein Problem, eine geeignete Funktion zum lesen zu basteln.
So sieht meine Funktion im Moment aus:std::vector<char> binary_socket::read(int maxlength) { int received; std::vector<char> buffer(maxlength); if((received = recv(sockfd, buffer.data(), maxlength, 0)) == -1) throw socket_error("disconnected from host"); buffer.erase(buffer.begin() + received, buffer.end()); return buffer; }Das Problem ist, dass hier auch weniger Daten ankommen können, als ich haben möchte. Ich möchte allerdings exakt so viel (Schließlich ist die Größe von Datentypen konstant), außerdem wäre ein Timeout nicht schlecht. Ich habe von der Funktion select() gelesen, mir der man sowas machen kann, allerdings ist mir deren Verwendung nicht klar. Jemand hier, der sich auskennt?

-
Wenn das doch sowieso ein Multiplattform Bot werden soll, warum benutzt du dann nicht gleich Java? So wie ich das jetzt sehe handelst du dir durch die Wahl von C++ 2 Probleme ein, die du mit Java sofort gelöst hättest.
-
Jop, dazu hab ich mich gestern entschieden. Wenn mir niemand helfen will. Dann halt nicht. :p
-
mal rein aus interesse, wie alt bist du mister PI ?
so im bereich anfang 20 oder sogar jünger?
-
16 :p
-
ok, super. erstmal respekt, da ich denke dass du einiges auf dem kasten hast in sachen fachwissen und c++
aber andererseits auch kritik: es muss nicht alles genau so gemacht werden wie du meinst. viele wege führen nach rom, gute und nicht so gute. und das muss nicht an jeder stelle, wie du es machst, kritisieren und darauf hinweisen. (denk an die RAII [von mir immer liebevoll R A 2 genannt xD] diskussion)
aber mach was deine fachliche kompetenz angeht weiter so
-
Der Bot läuft übrigens mittlerweile in Java.

Danke, Skym0sh0. Allerdings bin ich extrem pingelig, was RAII angeht (Yay, was für eine Neuigkeit.), und es macht einem nur mehr Arbeit, es nicht zu verwenden. Ich sehe auch keinen Grund, nicht RAII zu verwenden.