<?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[Bad file descriptor mit boost Threads und Sockets]]></title><description><![CDATA[<p>Hallo,<br />
ich wollte, um Boost Threads und Sockets besser zu verstehen, einen kleinen Server schreiben, der für jeden Client einen neuen Thread erzeugt und in diesem fortwähren einen Nachricht überträgt.<br />
Leider führt das nur zu einem Bad file descriptor, wenn ich in dem Thread auf den Socket zugreifen möchte.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::ip::tcp;
using namespace std;

void handleClient(tcp::socket* socket, string* message) {

    if(!socket || !message)
        return;

    while (1) {

        try {
            boost::asio::write(*socket, boost::asio::buffer(*message));
        } catch (std::exception&amp; e) {
            cerr &lt;&lt; e.what() &lt;&lt; std::endl;
            break;
        }
        sleep(1);
    }

    return;
}

int main(int argc, char* argv[]) {
    int port = 2323;

    if (argc &gt; 1)
        port = atoi(argv[1]);

    boost::asio::io_service io_service;

    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));

    cout &lt;&lt; &quot;Starting on &quot; &lt;&lt; port &lt;&lt; endl;

    string message = &quot;Hello World!\n&quot;;

    for (;;) {
        tcp::socket socket(io_service);
        acceptor.accept(socket);

//        handleClient(&amp;socket, &amp;message);
        boost::thread t(handleClient, &amp;socket, &amp;message);
    }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/277482/bad-file-descriptor-mit-boost-threads-und-sockets</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 21:00:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277482.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Nov 2010 11:04:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 11:04:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich wollte, um Boost Threads und Sockets besser zu verstehen, einen kleinen Server schreiben, der für jeden Client einen neuen Thread erzeugt und in diesem fortwähren einen Nachricht überträgt.<br />
Leider führt das nur zu einem Bad file descriptor, wenn ich in dem Thread auf den Socket zugreifen möchte.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::ip::tcp;
using namespace std;

void handleClient(tcp::socket* socket, string* message) {

    if(!socket || !message)
        return;

    while (1) {

        try {
            boost::asio::write(*socket, boost::asio::buffer(*message));
        } catch (std::exception&amp; e) {
            cerr &lt;&lt; e.what() &lt;&lt; std::endl;
            break;
        }
        sleep(1);
    }

    return;
}

int main(int argc, char* argv[]) {
    int port = 2323;

    if (argc &gt; 1)
        port = atoi(argv[1]);

    boost::asio::io_service io_service;

    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));

    cout &lt;&lt; &quot;Starting on &quot; &lt;&lt; port &lt;&lt; endl;

    string message = &quot;Hello World!\n&quot;;

    for (;;) {
        tcp::socket socket(io_service);
        acceptor.accept(socket);

//        handleClient(&amp;socket, &amp;message);
        boost::thread t(handleClient, &amp;socket, &amp;message);
    }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1982771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982771</guid><dc:creator><![CDATA[tonsiraff]]></dc:creator><pubDate>Fri, 19 Nov 2010 11:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 11:16:06 GMT]]></title><description><![CDATA[<p>Das Socket wird wohl zerstört, bevor der Thread überhaupt zu laufen beginnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982782</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 19 Nov 2010 11:16:06 GMT</pubDate></item><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 11:16:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for (;;)
{ 
    tcp::socket socket(io_service); // socket wird erstellt
    acceptor.accept(socket); 

    boost::thread t(handleClient, &amp;socket, &amp;message); // thread wird gestartet
} // socket wird zerstört -&gt; na viel Glück, wenn der Thread dann auf das Socket zugreift
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982785</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 19 Nov 2010 11:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 11:36:24 GMT]]></title><description><![CDATA[<p>Ah, danke, nun funktioniert's <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::ip::tcp;
using namespace std;

void handleClient(tcp::socket* socket, string* message) {

    if(!socket || !message)
        return;

    while (1) {

        try {
            boost::asio::write(*socket, boost::asio::buffer(*message));
        } catch (std::exception&amp; e) {
            cerr &lt;&lt; e.what() &lt;&lt; std::endl;
            break;
        }
        sleep(1);
    }

    delete socket;
    return;
}

int main(int argc, char* argv[]) {
    int port = 2323;

    if (argc &gt; 1)
        port = atoi(argv[1]);

    boost::asio::io_service io_service;

    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));

    cout &lt;&lt; &quot;Starting on &quot; &lt;&lt; port &lt;&lt; endl;

    string message = &quot;Hello World!\n&quot;;

    for (;;) {
        tcp::socket* socket = new tcp::socket(io_service);
        acceptor.accept(*socket);

        boost::thread t(handleClient, socket, &amp;message);
    }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1982793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982793</guid><dc:creator><![CDATA[tonsiraff]]></dc:creator><pubDate>Fri, 19 Nov 2010 11:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 11:47:54 GMT]]></title><description><![CDATA[<p>tonsiraff schrieb:</p>
<blockquote>
<p>Ah, danke, nun funktioniert's</p>
</blockquote>
<p>Nur wenn du Glück hast. Du spielst wohl gerne Russisch Roulette. Theoretisch könnten Threads weiterlaufen und der Hauptthread die <code>main</code> Funktion verlassen. <code>message</code> würde ungültig werden und du greifst noch darauf zu. Wieso übergibst du <code>message</code> überhaupt als Zeiger? Wieso nicht gleich als Kopie?<br />
Auch die Übergabe von <code>socket</code> als Zeiger halte ich nicht für so prickelnd. <code>boost::asio</code> bietet eigentlich bereits die Möglichkeit, das ganze über Threads laufen zu lassen, also mehrere Threads für mehrere Clients zu verwenden, ohne dass du solche Verrenkungen machen musst.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982802</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 19 Nov 2010 11:47:54 GMT</pubDate></item><item><title><![CDATA[Reply to Bad file descriptor mit boost Threads und Sockets on Fri, 19 Nov 2010 12:51:33 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982838</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 19 Nov 2010 12:51:33 GMT</pubDate></item></channel></rss>