<?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: asynchrones Empfangen funktioniert nur manchmal: Timing problem?]]></title><description><![CDATA[<p>Servus,</p>
<p>ich portiere (mal wieder) native Sockets nach boost::asio.</p>
<p>Zu diesem Zweck habe ich mir eine kleine Klasse anhand dieses Beispiels: <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/example/multicast/receiver.cpp" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/example/multicast/receiver.cpp</a><br />
geschrieben, die async_receive_from benutzt.</p>
<p>Es gibt eine Manager-Klasse, die den io_service, den Thread, und ein Objekt der Receiver-Klasse besitzt.</p>
<pre><code class="language-cpp">class Manager{
public:
    Manager();
    ~Manager();
private:
    void run();

    boost::asio::io_service m_io_service;

    std::auto_ptr&lt;Receiver&gt; m_receiver;

    boost::thread m_io_thread;

    std::auto_ptr&lt;boost::asio::io_service::work&gt; m_io_work;
};

Manager::Manager():
        m_io_service(),
        m_receiver(new Receiver(m_io_service, ip_addr, port),
        m_io_thread(boost::bind(&amp;Manager::run, this)),
        m_io_work(new boost::asio::io_service::work(m_io_service))
{}

Manager::~Manager()
{
    m_io_work.reset();
    m_io_thread.join();
}

void Manager::run()
{
    m_io_service.run();
}
</code></pre>
<p>Der Konstruktor der Receiver-Klasse ruft, wie im verlinkten Beispiel zu sehen, async_recv_from auf, und der davon aufgerufene Handler ruft wiederum async_recv_from auf.</p>
<p>So weit, so schön.</p>
<p>Jetzt habe ich zweites kleines Programm, das zu Testzwecken alle Sekunde ein Paket sendet.</p>
<p>Und jetzt das Problem: Mein Empfängerprogramm empfängt die Paket auch, aber nur manchmal. Und zwar abhängig wohl davon, wann es gestartet wird:<br />
Beispiel: Von zehn Programmstarts empfängt es neun mal überhaupt nichts, aber wenn es einmal beim Start was empfängt, empfängt es fürderhin alle Pakete.</p>
<p>Dieses &quot;zufällige&quot; Verhalten sieht mir irgendwie nach einem Timing-Problem aus, kann es sein, dass wenn beim ersten Aufruf von async_recv nix zu tun ist, der io_service.run zurückkehrt ? Aber gerade das wird doch laut <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_service_from_running_out_of_work" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_service_from_running_out_of_work</a> durch work verhindert?</p>
<p>Ich steh echt auf'm Schlauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251340/boost-asio-asynchrones-empfangen-funktioniert-nur-manchmal-timing-problem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 12:49:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251340.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Oct 2009 10:43:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 10:43:11 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich portiere (mal wieder) native Sockets nach boost::asio.</p>
<p>Zu diesem Zweck habe ich mir eine kleine Klasse anhand dieses Beispiels: <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/example/multicast/receiver.cpp" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/example/multicast/receiver.cpp</a><br />
geschrieben, die async_receive_from benutzt.</p>
<p>Es gibt eine Manager-Klasse, die den io_service, den Thread, und ein Objekt der Receiver-Klasse besitzt.</p>
<pre><code class="language-cpp">class Manager{
public:
    Manager();
    ~Manager();
private:
    void run();

    boost::asio::io_service m_io_service;

    std::auto_ptr&lt;Receiver&gt; m_receiver;

    boost::thread m_io_thread;

    std::auto_ptr&lt;boost::asio::io_service::work&gt; m_io_work;
};

Manager::Manager():
        m_io_service(),
        m_receiver(new Receiver(m_io_service, ip_addr, port),
        m_io_thread(boost::bind(&amp;Manager::run, this)),
        m_io_work(new boost::asio::io_service::work(m_io_service))
{}

Manager::~Manager()
{
    m_io_work.reset();
    m_io_thread.join();
}

void Manager::run()
{
    m_io_service.run();
}
</code></pre>
<p>Der Konstruktor der Receiver-Klasse ruft, wie im verlinkten Beispiel zu sehen, async_recv_from auf, und der davon aufgerufene Handler ruft wiederum async_recv_from auf.</p>
<p>So weit, so schön.</p>
<p>Jetzt habe ich zweites kleines Programm, das zu Testzwecken alle Sekunde ein Paket sendet.</p>
<p>Und jetzt das Problem: Mein Empfängerprogramm empfängt die Paket auch, aber nur manchmal. Und zwar abhängig wohl davon, wann es gestartet wird:<br />
Beispiel: Von zehn Programmstarts empfängt es neun mal überhaupt nichts, aber wenn es einmal beim Start was empfängt, empfängt es fürderhin alle Pakete.</p>
<p>Dieses &quot;zufällige&quot; Verhalten sieht mir irgendwie nach einem Timing-Problem aus, kann es sein, dass wenn beim ersten Aufruf von async_recv nix zu tun ist, der io_service.run zurückkehrt ? Aber gerade das wird doch laut <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_service_from_running_out_of_work" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_service_from_running_out_of_work</a> durch work verhindert?</p>
<p>Ich steh echt auf'm Schlauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787601</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 03 Oct 2009 10:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 12:53:23 GMT]]></title><description><![CDATA[<p>Zeig doch mal den auf das wesentliche reduzierte Code für das Senden und für das Empfangen. Ich meine, dass sind doch die entscheidenden Codestücke! Mit deinen Informationen hier, welche du uns gegeben hast, können wir nur raten.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787644</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 03 Oct 2009 12:53:23 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 13:02:59 GMT]]></title><description><![CDATA[<p>Hier der Rest vom Code</p>
<pre><code class="language-cpp">int main()
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1787646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787646</guid><dc:creator><![CDATA[PhilipM]]></dc:creator><pubDate>Sat, 03 Oct 2009 13:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 14:29:47 GMT]]></title><description><![CDATA[<p>Das ist der Receiver:</p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/bind.hpp&gt;

typedef boost::asio::ip::udp::endpoint UDPEndpoint;
typedef boost::asio::ip::udp::socket UDPSocket;

class Receiver
{
public:
    Receiver(boost::asio::io_service&amp; io_service, const boost::asio::ip::address&amp; multicast_address, short multicast_port);

   void handle_receive_from(const boost::system::error_code&amp; error,
                             std::size_t bytes_recvd);

private:

    UDPEndpoint m_endpoint;

    UDPSocket m_socket;

    enum { max_length = 1440 };

    char data_[max_length];

};

Receiver::Receiver(boost::asio::io_service&amp; io_service,const boost::asio::ip::address&amp; multicast_address, short multicast_port)
: m_socket(io_service)
{
    UDPEndpoint listen_endpoint(multicast_address, multicast_port);
    m_socket.open(listen_endpoint.protocol());

    // REUSE PORT bzw. REUSE ADDR
    m_socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
    m_socket.bind(listen_endpoint);

    // Join the multicast group.
    m_socket.set_option(boost::asio::ip::multicast::join_group(multicast_address));

    m_socket.async_receive_from(boost::asio::buffer(data_, max_length),
                                m_endpoint,
                                boost::bind(&amp;Receiver::handle_receive_from,
                                            this,
                                            boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred)
                                );
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void Receiver::handle_receive_from(const boost::system::error_code&amp; error,
                                                           std::size_t bytes_recvd)
{
    if(error)
    {
        std::cout &lt;&lt; &quot;Async receive failed with: &quot; &lt;&lt; error.message() &lt;&lt; std::endl;
    }
    else
    {
        std::cout.write(data_,bytes_recvd);

    m_socket.async_receive_from(boost::asio::buffer(data_, max_length),
                                m_endpoint,
                                boost::bind(&amp;Receiver::handle_receive_from,
                                            this,
                                            boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred)
                                );
    }
}
</code></pre>
<p>EDIT: Was soll denn das für ein Scherzposting sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787648</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 03 Oct 2009 14:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 13:43:53 GMT]]></title><description><![CDATA[<p>Zu erwähnen ist noch, dass das run des threads in jedem Fall gestartet wird, das habe ich überprüft.</p>
<p>Der Sender ist ebenfalls nicht das Problem, der läuft seit Monaten zuverlässig und arbeitet mit dem auf nativen Unix-Sockets basierenden receiver problemlos zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787653</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 03 Oct 2009 13:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 14:28:34 GMT]]></title><description><![CDATA[<p>Dumm? Was sehen wird jetzt? Was ist AsynchronousUDPMulticastReceiver?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787672</guid><dc:creator><![CDATA[PhilipM]]></dc:creator><pubDate>Sat, 03 Oct 2009 14:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio: asynchrones Empfangen funktioniert nur manchmal: Timing problem? on Sat, 03 Oct 2009 14:32:11 GMT]]></title><description><![CDATA[<p>Beim Posten hab ich den Namen vergessen zu editieren... war wohl etwas in Eile. Hab den Post editiert.</p>
<p>Es sind nur die zwei Klassen beteiligt.</p>
<p>Ich erzeuge eine Instanz des managers, der stößt den Thread an (kann man mittels einer Ausgabe sehen), und in 90% der Fälle passiert dann nix.</p>
<p>Und könntest du bitte unter einem anderen Namen posten, das verwirrt mich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1787675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1787675</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 03 Oct 2009 14:32:11 GMT</pubDate></item></channel></rss>