<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[boost::asio : Unklarheiten beim Migrieren von einer nativen socket-Lösung]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hab da mal ne Frage:</p>
<p>Beim Umstellen einer Funktionalität von nativen socket-funktionen auf boost::asio stehe ich vor dem Problem, dass die normale socket write_to funktion in einem integer die Anzahl geschriebener bytes zurückgibt, womit es einfach ist, Fehler abzufangen.</p>
<p>Die asio::write funktion tut auch genau das, nicht aber die async_write funktion, was ja klar ist, da sie sofort zurückkehrt, bevor was geschrieben wurde.</p>
<p>Aber in dieser registriert man ja eine handler-funktion die aufgerufen wird, wenn der Krempel tatsächlich geschrieben wurde.</p>
<p>Die übernimmt einen errorcode und eine size_t, wobei ich messerscharf folgere, das diese size_t die geschriebenen bytes sind.</p>
<p>Mein Ansatz ist daher folgender:</p>
<pre><code class="language-cpp">void meine_klasse::handle_sento(size_t correct_size, const boost::system::error_code&amp; error, size_t bytes_written)
{
    if (error)
        Logger::log() &lt;&lt; &quot;Async send failed with: &quot; &lt;&lt; error.message();
    if (bytes_written != correct_size)
        Logger::log() &lt;&lt; &quot;Async send returned wrong number of bytes written, this indicates network problems&quot;;
}

void meine_klasse::async_write(const void* data, size_t sz)
{
    m_socket.async_send_to( boost::asio::buffer((const char*)data, sz),
                            m_endpoint,
                            boost::bind(&amp;meine_klasse::handle_send_to,
                                        this, sz,
                                        boost::asio::placeholders::error, 
                                        boost::asio::placeholders::bytes_transferred()));
}
</code></pre>
<p>Dieses placeholders::bytes_transferred() ist ein Schuß ins blaue, aber es _scheint_ zu funktionieren.</p>
<p>Vielleicht kann mir eine asio-Guru kurz sagen, ob ich auf dem richtigen Weg bin.</p>
<p>Zweite Frage: Ihr seht dass ich einen const void* übernehme. Die socket send_to lässt sich nämlich einfach einen void* und eine länge geben und dann schreibt sie so viele bytes wie angebene die an dieser Adresse stehen raus. Das ist für meine Anwendung sehr angenehm und funktioniert (getestet).</p>
<p>Wie verhält es sich mit der async_send_to funktion? Kann ich der auch rohe Daten zu fressen geben? Meine jetzige Lösung (siehe oben) scheint erstmal implizit in einen std::string zu konvertieren.<br />
Wenn nein, wie implementiere ich ohne möglichst große chirurgische Eingriffe eine serialisierung?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243783/boost-asio-unklarheiten-beim-migrieren-von-einer-nativen-socket-lösung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 20:31:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243783.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Jun 2009 11:06:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::asio : Unklarheiten beim Migrieren von einer nativen socket-Lösung on Sun, 21 Jun 2009 11:10:28 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hab da mal ne Frage:</p>
<p>Beim Umstellen einer Funktionalität von nativen socket-funktionen auf boost::asio stehe ich vor dem Problem, dass die normale socket write_to funktion in einem integer die Anzahl geschriebener bytes zurückgibt, womit es einfach ist, Fehler abzufangen.</p>
<p>Die asio::write funktion tut auch genau das, nicht aber die async_write funktion, was ja klar ist, da sie sofort zurückkehrt, bevor was geschrieben wurde.</p>
<p>Aber in dieser registriert man ja eine handler-funktion die aufgerufen wird, wenn der Krempel tatsächlich geschrieben wurde.</p>
<p>Die übernimmt einen errorcode und eine size_t, wobei ich messerscharf folgere, das diese size_t die geschriebenen bytes sind.</p>
<p>Mein Ansatz ist daher folgender:</p>
<pre><code class="language-cpp">void meine_klasse::handle_sento(size_t correct_size, const boost::system::error_code&amp; error, size_t bytes_written)
{
    if (error)
        Logger::log() &lt;&lt; &quot;Async send failed with: &quot; &lt;&lt; error.message();
    if (bytes_written != correct_size)
        Logger::log() &lt;&lt; &quot;Async send returned wrong number of bytes written, this indicates network problems&quot;;
}

void meine_klasse::async_write(const void* data, size_t sz)
{
    m_socket.async_send_to( boost::asio::buffer((const char*)data, sz),
                            m_endpoint,
                            boost::bind(&amp;meine_klasse::handle_send_to,
                                        this, sz,
                                        boost::asio::placeholders::error, 
                                        boost::asio::placeholders::bytes_transferred()));
}
</code></pre>
<p>Dieses placeholders::bytes_transferred() ist ein Schuß ins blaue, aber es _scheint_ zu funktionieren.</p>
<p>Vielleicht kann mir eine asio-Guru kurz sagen, ob ich auf dem richtigen Weg bin.</p>
<p>Zweite Frage: Ihr seht dass ich einen const void* übernehme. Die socket send_to lässt sich nämlich einfach einen void* und eine länge geben und dann schreibt sie so viele bytes wie angebene die an dieser Adresse stehen raus. Das ist für meine Anwendung sehr angenehm und funktioniert (getestet).</p>
<p>Wie verhält es sich mit der async_send_to funktion? Kann ich der auch rohe Daten zu fressen geben? Meine jetzige Lösung (siehe oben) scheint erstmal implizit in einen std::string zu konvertieren.<br />
Wenn nein, wie implementiere ich ohne möglichst große chirurgische Eingriffe eine serialisierung?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730409</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sun, 21 Jun 2009 11:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio : Unklarheiten beim Migrieren von einer nativen socket-Lösung on Sun, 21 Jun 2009 13:15:41 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Dieses placeholders::bytes_transferred() ist ein Schuß ins blaue, aber es _scheint_ zu funktionieren.</p>
<p>Vielleicht kann mir eine asio-Guru kurz sagen, ob ich auf dem richtigen Weg bin.</p>
</blockquote>
<p>Wieso liest du nicht einfach die Dokumentation?<br />
<a href="http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/placeholders__error.html" rel="nofollow">placeholders::error</a><br />
<a href="http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/placeholders__bytes_transferred.html" rel="nofollow">placeholders::bytes_transferred</a></p>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Zweite Frage: Ihr seht dass ich einen const void* übernehme. Die socket send_to lässt sich nämlich einfach einen void* und eine länge geben und dann schreibt sie so viele bytes wie angebene die an dieser Adresse stehen raus. Das ist für meine Anwendung sehr angenehm und funktioniert (getestet).</p>
<p>Wie verhält es sich mit der async_send_to funktion? Kann ich der auch rohe Daten zu fressen geben?</p>
</blockquote>
<p>Wieso liest du nicht einfach die Dokumentation?<br />
<a href="http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/buffer/overload5.html" rel="nofollow">buffer (5 of 22 overloads)</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730484</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 21 Jun 2009 13:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio : Unklarheiten beim Migrieren von einer nativen socket-Lösung on Sun, 21 Jun 2009 14:48:36 GMT]]></title><description><![CDATA[<p>Vielleicht weil ich für die Navigation in dieser Hilfe ein bißchen zu blöd bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Die Seiten hatte ich bisher nicht gesehen, habe immer nur dokumentierte h-files gesehen.<br />
Dann danke für die Links.<br />
Das beantwortet schonmal meine erste Frage positiv. Und für die zweite habe ich gerade ausprobiert, es geht tatsächlich auch hier mit Rohdaten. Sehr gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730537</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sun, 21 Jun 2009 14:48:36 GMT</pubDate></item></channel></rss>