Boost::asio fehler
-
Hi!
Ich hab ein bisschen mit boost::asio rumprobiert und bin auf ein Problem gestoßen. Wenn ich von meinem Server zum Clienten eine Nachricht schicke, z.b. "hello", dann kommthello╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠¶§9
an... :-o
hier meine 2 funktionen zum senden und empfangen:
Send(Server):int net::send(std::string ToSend) { void *Data; Data = &ToSend; packet Packet(1,20,Data); void *PacketPnt; PacketPnt = &Packet; boost::asio::write(socket,boost::asio::buffer(PacketPnt,sizeof(PacketPnt)),boost::asio::transfer_all(),error_c); if(error_c == boost::asio::error::connection_aborted)//if connection is closed { socket.close(); return 1; } return 0; }
GetMessages(Client):
int net::get_messages(std::string &order) { boost::array<char, 128> buffer; boost::system::error_code error_c; size_t length = socket.read_some(boost::asio::buffer(order), error_c); order = buffer.data(); std::cout << order << std::endl; if (error_c == boost::asio::error::eof) return 2; return 0;
Jemand ne Idee?
Danke schonmal,
FinnPS: Das Zeichen, das es da in der Konsole ausgibt wird hier leider als "#9568;" dargestellt
-
Ich hab noch nie boost::array verwendet, aber warum sollte es automatisch 0-terminiert werden?
-
"0-terminiert" ????
-
C-Strings müssen 0-terminiert sein ('\0' am Ende). http://en.wikipedia.org/wiki/C_string
-
Hab ich jetzt mal gemacht...kein unterschied
Kommt immer noch das, was es eigentlich senden soll und diese komischen Zeichen an...
Edit: Ich glaube aber eher, dass es am Client liegt...wenn ich nämlich mit PuTTY zu meinem Server connecte und dann was sende, kommt es richtig an. :-o
-
Weiß niemand Rat?
-
int net::send(std::string ToSend) { void *Data; Data = &ToSend; packet Packet(1,20,Data); void *PacketPnt; PacketPnt = &Packet; boost::asio::write(socket,boost::asio::buffer(PacketPnt,sizeof(PacketPnt)),boost::asio::transfer_all(),error_c);
Das sieht schon mal ziemlich falsch aus.
das ist vermutlich was du willst:
int net::send(std::string const &to_send) { boost::asio::write(socket, boost::asio::buffer(to_send), boost::asio::transfer_all(), error_c); // ...
siehe http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/tutorial/tutdaytime2.html
-
Bei dem Codeauschnitt hatte ich es mit einer Packet-klasse versucht...
Deine Lösung hab ich auch schon versucht...aber gleiches Ergebnis. Und wie gesagt, ich denke, dass es eher am Cliet liegt, denn wenn ich per Telnet connecte empfange ich die Nachrichten richtig, wie gewollt
-
Vielleicht hast du die 0-Terminierung nicht richtig gemacht. Prüf doch einfach mit wireshark, was nun wirklich über die Leitung kommt.
-
Wireshark zeigt das hier an:
0000 00 26 18 d0 46 c8 00 24 fe 34 2a e7 08 00 45 00 begin_of_the_skype_highlighting 08 00 45 00 end_of_the_skype_highlighting .&..F..$ .4*...E. 0010 00 39 38 16 40 00 7e 06 f4 11 54 93 09 46 c0 a8 .98.@.~. ..T..F.. 0020 b2 15 26 94 c1 bb 0a 3b 36 c4 9e 5e f4 dd 80 18 ..&....; 6..^.... 0030 01 02 56 5a 00 00 01 01 08 0a 00 01 2a 1c 00 01 ..VZ.... ....*... 0040 1e 31 65 72 72 6f 72 .1error
...
Ich deute das einfach mal als solches, dass wirklich nur "error" gesendet wird("error" ist das, was ich gesendet habe, bzw. senden wollte).
Der Client allerdings zeigt das falsch an O_o