<?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[SocketServer und MessageQueue]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich schreib mir grad nen einfachen SocketServer. Der läuft in einem extra Thread und dieser Thread hat eine MessageQueue durch die er Daten mit andern Threads austauscht. Der Socket wartet mit Hilfe von select auf einkommende Verbindungen oder Daten von Clients. Als Timeout für select hab ich 1sec gewählt. Das Problem ist jetzt, dass solange select blockiert ja keine Messages abgearbeitet werden können. Kann ich irgendwie einen eigenen FileDescriptor anlegen, den ich dann beim select mit überwachen kann? So könnte ich das select beim eintreffen neuer Messages wieder aufwecken. So sieht das zur Zeit aus:</p>
<pre><code>int err;
    fd_set tmpFdSet;
    map&lt;int, SocketConnection*&gt;::iterator i;
    struct timeval timeout;
    try
    {
        openSocket();
        updateFileHandleSet();

        while (!isTerminated())
        {
            tmpFdSet = this-&gt;_fileHandleSet;
            timeout = TimeVal::getCurrentTime(SOCKET_SERVER_CYCLE_TIMEOUT);
            if ((err = select(this-&gt;_maxFileHandle+1, &amp;tmpFdSet, NULL, NULL, &amp;timeout)) &lt; 0)
            {
                ostringstream ss;
                ss &lt;&lt; &quot;error while waiting (select) for server file descriptor: &quot; &lt;&lt; err;
                throw ETcpSocketModule(ss.str());
            }                

            if (FD_ISSET(this-&gt;_serverFileHandle, &amp;tmpFdSet))
                acceptConnection();

            i = _connections.begin();
            while(i != _connections.end())
            {
                if (FD_ISSET((*i).first, &amp;tmpFdSet) &amp;&amp; !(*i).second-&gt;progress())
                    i = _connections.erase(i);
                else
                    i++;
            }

            progressMessages();
        }
    }
    catch(Exception ex)
    {
        this-&gt;_owner-&gt;log(&quot;error while executing server socket thread:\n&quot;, ex);
    }
</code></pre>
<p>Bin dankbar für jegliche Art von Kommentaren.</p>
<p>MfG Bergmann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323441/socketserver-und-messagequeue</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 04:47:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323441.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jan 2014 10:29:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SocketServer und MessageQueue on Thu, 30 Jan 2014 10:29:59 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich schreib mir grad nen einfachen SocketServer. Der läuft in einem extra Thread und dieser Thread hat eine MessageQueue durch die er Daten mit andern Threads austauscht. Der Socket wartet mit Hilfe von select auf einkommende Verbindungen oder Daten von Clients. Als Timeout für select hab ich 1sec gewählt. Das Problem ist jetzt, dass solange select blockiert ja keine Messages abgearbeitet werden können. Kann ich irgendwie einen eigenen FileDescriptor anlegen, den ich dann beim select mit überwachen kann? So könnte ich das select beim eintreffen neuer Messages wieder aufwecken. So sieht das zur Zeit aus:</p>
<pre><code>int err;
    fd_set tmpFdSet;
    map&lt;int, SocketConnection*&gt;::iterator i;
    struct timeval timeout;
    try
    {
        openSocket();
        updateFileHandleSet();

        while (!isTerminated())
        {
            tmpFdSet = this-&gt;_fileHandleSet;
            timeout = TimeVal::getCurrentTime(SOCKET_SERVER_CYCLE_TIMEOUT);
            if ((err = select(this-&gt;_maxFileHandle+1, &amp;tmpFdSet, NULL, NULL, &amp;timeout)) &lt; 0)
            {
                ostringstream ss;
                ss &lt;&lt; &quot;error while waiting (select) for server file descriptor: &quot; &lt;&lt; err;
                throw ETcpSocketModule(ss.str());
            }                

            if (FD_ISSET(this-&gt;_serverFileHandle, &amp;tmpFdSet))
                acceptConnection();

            i = _connections.begin();
            while(i != _connections.end())
            {
                if (FD_ISSET((*i).first, &amp;tmpFdSet) &amp;&amp; !(*i).second-&gt;progress())
                    i = _connections.erase(i);
                else
                    i++;
            }

            progressMessages();
        }
    }
    catch(Exception ex)
    {
        this-&gt;_owner-&gt;log(&quot;error while executing server socket thread:\n&quot;, ex);
    }
</code></pre>
<p>Bin dankbar für jegliche Art von Kommentaren.</p>
<p>MfG Bergmann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380573</guid><dc:creator><![CDATA[Bergmann89]]></dc:creator><pubDate>Thu, 30 Jan 2014 10:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to SocketServer und MessageQueue on Thu, 30 Jan 2014 10:52:41 GMT]]></title><description><![CDATA[<p>Kannst Du nicht den Serversocket in einem eigenen nur dafür vorgesehenen Thread laufen lassen? Dann kann der messageverarbeitende Thread verzögerungsfrei seine Messages abarbeiten.<br />
Wenn der Serversocket etwas zu vermelden hat wie eingehende Verbindungen, oder Daten, schickt er dem messageverarbeitenden Thread eine entsprechende Message, die dieser dann verarbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380574</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 30 Jan 2014 10:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to SocketServer und MessageQueue on Thu, 30 Jan 2014 11:02:03 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>das ist mir auch schon in den Sinn gekommen, das wäre sozusagen die alternativ-Lösung. Ich wollt aber erstmal nachfragen ob es evtl. auch mit einem Thread sinnvoll geht...</p>
<p>MfG Bergmann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380575</guid><dc:creator><![CDATA[Bergmann89]]></dc:creator><pubDate>Thu, 30 Jan 2014 11:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to SocketServer und MessageQueue on Thu, 30 Jan 2014 16:42:36 GMT]]></title><description><![CDATA[<p>Wenn es ein Fenster-Thread wäre, gäbe es wohl<br />
<a href="http://msdn.microsoft.com/de-de/library/windows/desktop/ms741540%28v=vs.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/de-de/library/windows/desktop/ms741540(v=vs.85).aspx</a><br />
dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380619</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 30 Jan 2014 16:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to SocketServer und MessageQueue on Thu, 30 Jan 2014 18:07:58 GMT]]></title><description><![CDATA[<p>Einfach nicht select() benutzen. Wenn du schon auf schlecht skalierende Server stehst, dann nimm WaitForMultipleObjects() und WSAEventSelect(), dann kannst du beliebige EVENT-Objekte gleichzeitig überwachen (also auch eins für deine Msg-Queue). Oder du nimmst gleich Boost, was dir schön Overlapped I/O mit I/O-Completionports für beste Performance liefert, bugfrei und plattformunabhängig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380638</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 30 Jan 2014 18:07:58 GMT</pubDate></item><item><title><![CDATA[Reply to SocketServer und MessageQueue on Fri, 31 Jan 2014 07:00:27 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>vlt sollte ich doch etwas weiter ausholen.<br />
Das ganze Projekt soll am Ende auf einem embedded System laufen. Der Server soll also am Ende keine hunderte von Verbindungen managen, sondern dient nur zur Kommunikation zwischen dem Gerät und einigen wenigen Clients (worst-case ca. 5). Da das embedded System bei weitem nicht so leistungsstark ist wie ein normaler PC, läuft das mit der Skalierung vom Server hier auch ein wenig anders, deshalb auch nur ein Thread für den kompletten Server. Auf dem Gerät kommt Linux zum Einsatz, also wird das mit den WinAPI Funktionen leider nichts. An boost hab ich auch schon gedacht, aber da hatte ich bedenken, das es evlt wieder zu overkill für das kleine System ist.</p>
<p>MfG Bergmann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380724</guid><dc:creator><![CDATA[Bergmann89]]></dc:creator><pubDate>Fri, 31 Jan 2014 07:00:27 GMT</pubDate></item></channel></rss>