Boost::asio

10/09/2014 15:25 herlex#1
Heyho. habe ein Problem mit der async_read function der boost asio library.
Ich möchte einen kompletten Satz von Programm1 zu Programm2 schicken, allerdings wird der String/Buffer sehr ungewöhnlich und komisch getrennt, wenn man versucht diesen dann zu readen.....


Kann mir da jemand weiterhelfen?
Ich weiß, dass das hier sehr einfach gehaltene Fragen sind.
Für mehr Details bitte per PN melden.

Brauche dringend Hilfe!
Danke!
10/09/2014 15:52 qqdev#2
Schick mir deinen Skypenamen via PM.
10/09/2014 16:03 th0rex#3
Ich nehme mal snow die Arbeit ab.
Wenn du Hilfe willst dann schreib doch gleich in das Thema alle relevanten Sachen zu der Frage. Ich meine warum sollte man dir unbedingt eine PM schreiben ? Ist der code etwa "geheim" oder was ganz tolles was du hier bloß nicht teilen willst ? Wenn ja, dann solltest du dich damit abfinden, dass du nicht viel Hilfe, wenn überhaupt welche, bekommst. Elitepvpers ist immer noch ein Forum und keine Partnerbörse (alle credits zu snow für den satz :P ).
10/09/2014 16:48 herlex#4
ja. der code ist geheim. ist ein noch nicht patentiertes projekt, das grade im entstehen ist.
brauch halt hilfe mnit diesem dummen async_read, da das bei mir nicht hinhaut.

greetz.
10/09/2014 17:02 Schlüsselbein#5
Mach den Fehler reproduzierbar und poste die Problemstellung hier. Falls zu viel Ramsch drumherum ist, erstell ein kleines Projekt mit genau diesem Fehler.
10/09/2014 17:59 Mostey#6
Quote:
Originally Posted by MaggieSimpson View Post
Ich möchte einen kompletten Satz von Programm1 zu Programm2 schicken, allerdings wird der String/Buffer sehr ungewöhnlich und komisch getrennt,
Hängt vielleicht ein Nullterminator dazwischen?
10/09/2014 21:26 Delinquenz#7
Quote:
Ich möchte einen kompletten Satz von Programm1 zu Programm2 schicken, allerdings wird der String/Buffer sehr ungewöhnlich und komisch getrennt,
Das liegt wahrscheinlich an der Eigenart des TCP-Protokolls, Stream ist das gesuchte Stichwort.
10/09/2014 22:41 herlex#8
Ich baue eine Verbindung zwischen zwei Konsolenanwendungen auf.
Erste Anwendung = Server.
Der Server hört endlos mit async_read_some darauf, ob etwas reinkommt.
Wenn etwas reinkommt wird der input in einem boost::array<char, 4096> buffer gespeichert. Dann wird der Readhandler aufgerufen, indem mit std::cout die bufferdata durch folgenden code ausgegeben wird.

std::cout << std::string(buffer.data(), bytes_transferred) << std::endl;

Die Client Anwendung sendet per async_write lediglich den Text an den Server.
Das Problem liegt vermutlich an async_read_some....

Habe es schon mit async_read_until versucht und einen delimiter wie \r eingefügt, allerdings funktioniert das auch nicht.

Greetz. Hoffe das ist ausführlich genug fürs erste :)
10/10/2014 08:52 th0rex#9
Schon mal async_read oder socket.async_receive probiert ?
10/10/2014 13:54 herlex#10
Quote:
Originally Posted by omitma View Post
Schon mal async_read oder socket.async_receive probiert ?
Jop. Bei beidemder selbe Effekt...
10/10/2014 15:22 Padmak#11
Also ich glaube dass wir dir hier nicht weiter helfen können, ohne wirklichen Code zu sehen.
Extrahier so wie schon von Schlüsselbein vorgeschlagen den wichtigsten Code in ein neues Projekt, und bau Server und Client so abgespeckt wie möglich. Wenn der Fehler noch existiert, gib uns den Code, nur dann kann dir auch geholfen werden

Padmak
10/10/2014 22:34 Mostey#12
Quote:
Originally Posted by MaggieSimpson View Post
std::string(buffer.data(), bytes_transferred)
Quote:
Originally Posted by Mostey View Post
Hängt vielleicht ein Nullterminator dazwischen?
^

Sieht sogar sehr wahrscheinlich nach einem Nullterminator in der Mitte aus. Du solltest das mal selber prüfen wenn du schon keinen Code posten möchtest...
10/13/2014 07:47 herlex#13
Ich werde heute Abend/morgen mal was posten.
Wenn man einen String so an den Server vom Client sendet: "Hallo Du"
Dann erhält der Server diesen String so.

Hallo
Du

bzw. wenn der String so aussieht: "Hallo Wie geht es dir"
Dann sieht das ganze so aus:

Hallo
Wiegehtesdir

Hier der Code:

Code:
#include <boost/asio.hpp> 
#include <boost/array.hpp> 
#include <iostream> 
#include <string> 

boost::asio::io_service io_service; 
boost::asio::ip::tcp::resolver resolver(io_service); 
boost::asio::ip::tcp::socket sock(io_service); 
boost::array<char, 4096> buffer; 

void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
  if (!ec) 
  { 
    std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; 
    sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
  } 
} 

void connect_handler(const boost::system::error_code &ec) 
{ 
  if (!ec) 
  { 
    sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
  } 
} 

void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
{ 
  if (!ec) 
  { 
    sock.async_connect(*it, connect_handler); 
  } 
} 

int main() 
{ 
  boost::asio::ip::tcp::resolver::query query("ip", "80"); 
  resolver.async_resolve(query, resolve_handler); 
  io_service.run(); 
}
10/13/2014 16:47 Delinquenz#14
Dass der String abgeschnitten ankommt, liegt, wie ich bereits anmerkte, in der Natur des TCP-Protokolls.