<?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[Winsock, DirectX und select..]]></title><description><![CDATA[<p>Guten morgen allerseits<br />
Einmal mehr gibts ein Topic über Winsocks und die Funktion select(). Ich habe zwar schon tausende dazu gefunden, aber helfen konnte mir leider keines.</p>
<p>Also folgendes ist die Situation:<br />
Ich habe ein Server - Client Programm geschrieben das Winsock nutzt. Der Server ist eine Konsolenanwendung, der Client ein Windowsfenster in dem ich auch DirectX nutze.<br />
Der Server kann problemlos mehrere Clients behandeln, dazu benutze ich die Funktion select().<br />
Das Problem liegt beim Client. Nämlich habe ich eine Hauptschleife in der zuerst Tastatur- sowie Mausabfragen gemacht werden, das Bild wird neu gezeichnet und ähnliches. Danach überprüfe ich mittels select ob auf dem Socket Daten kommen, und wenn dies der Fall ist (!) frage ich die Daten mit recv() ab.<br />
Das Problem liegt dabei dass recv() blockiert. Eigentlich kein Problem, schliesslich kommt die Funktion sofort zurück weil ich ja zuerst überprüfe ob überhaupt Daten zum abfragen da sind.. Nur behauptet select() immer es seien Daten da, auch wenn eigentlich gar nichts kommt, wodurch recv() blockiert. Das ganze Programm wird lahmgelegt.<br />
Vermutlich kann mir anhand von dem niemand sagen wo der Fehler liegt, also etwas Code:</p>
<p><strong>Hauptschleife:</strong></p>
<pre><code>while (1)
    {
        if( PeekMessage(&amp;messages, NULL, 0, 0, PM_REMOVE) )
        {
            TranslateMessage(&amp;messages); 
            DispatchMessage(&amp;messages);
        }  
        else
        {    
             if( keyIsPressed(DIK_ESCAPE) ) // Beenden
             {
                 break;
             }

            /****************************/
            // fdSet mit Sockets füllen //
            /****************************/

            FD_ZERO(&amp;fdSet);
            FD_SET(s,&amp;fdSet);

            /****************/
            // Selectaufruf //
            /****************/

            l_err = select( 0, &amp;fdSet, NULL, NULL, NULL );

            if( l_err == SOCKET_ERROR )
            {
                MessageBox(hwnd, &quot;Fehler.&quot;,&quot;&quot;,MB_OK);
                return 0;
            }        
            else if( FD_ISSET(s, &amp;fdSet) )
            {
                l_err = recv(s,buf,8000,0);

                if( l_err == 0 )
                {
                    MessageBox(hwnd,&quot;Der Server hat die Verbindung getrennt.&quot;,&quot;&quot;,MB_OK);
                    break;
                }
                else if( l_err == SOCKET_ERROR )
                { 
                     MessageBox(hwnd,&quot;Fehler.&quot;,&quot;&quot;,MB_OK);                 
                     break;
                } 

                render();  
            }
        }      
    }
</code></pre>
<p>Sobald ich recv() rausnehme läuft alles problemlos.<br />
Wenn ihr noch irgendwelchen Code sehen wollt sagt es einfach.</p>
<p>Gruss, joscht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/141832/winsock-directx-und-select</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 11:23:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/141832.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Mar 2006 14:03:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Winsock, DirectX und select.. on Sat, 25 Mar 2006 14:03:30 GMT]]></title><description><![CDATA[<p>Guten morgen allerseits<br />
Einmal mehr gibts ein Topic über Winsocks und die Funktion select(). Ich habe zwar schon tausende dazu gefunden, aber helfen konnte mir leider keines.</p>
<p>Also folgendes ist die Situation:<br />
Ich habe ein Server - Client Programm geschrieben das Winsock nutzt. Der Server ist eine Konsolenanwendung, der Client ein Windowsfenster in dem ich auch DirectX nutze.<br />
Der Server kann problemlos mehrere Clients behandeln, dazu benutze ich die Funktion select().<br />
Das Problem liegt beim Client. Nämlich habe ich eine Hauptschleife in der zuerst Tastatur- sowie Mausabfragen gemacht werden, das Bild wird neu gezeichnet und ähnliches. Danach überprüfe ich mittels select ob auf dem Socket Daten kommen, und wenn dies der Fall ist (!) frage ich die Daten mit recv() ab.<br />
Das Problem liegt dabei dass recv() blockiert. Eigentlich kein Problem, schliesslich kommt die Funktion sofort zurück weil ich ja zuerst überprüfe ob überhaupt Daten zum abfragen da sind.. Nur behauptet select() immer es seien Daten da, auch wenn eigentlich gar nichts kommt, wodurch recv() blockiert. Das ganze Programm wird lahmgelegt.<br />
Vermutlich kann mir anhand von dem niemand sagen wo der Fehler liegt, also etwas Code:</p>
<p><strong>Hauptschleife:</strong></p>
<pre><code>while (1)
    {
        if( PeekMessage(&amp;messages, NULL, 0, 0, PM_REMOVE) )
        {
            TranslateMessage(&amp;messages); 
            DispatchMessage(&amp;messages);
        }  
        else
        {    
             if( keyIsPressed(DIK_ESCAPE) ) // Beenden
             {
                 break;
             }

            /****************************/
            // fdSet mit Sockets füllen //
            /****************************/

            FD_ZERO(&amp;fdSet);
            FD_SET(s,&amp;fdSet);

            /****************/
            // Selectaufruf //
            /****************/

            l_err = select( 0, &amp;fdSet, NULL, NULL, NULL );

            if( l_err == SOCKET_ERROR )
            {
                MessageBox(hwnd, &quot;Fehler.&quot;,&quot;&quot;,MB_OK);
                return 0;
            }        
            else if( FD_ISSET(s, &amp;fdSet) )
            {
                l_err = recv(s,buf,8000,0);

                if( l_err == 0 )
                {
                    MessageBox(hwnd,&quot;Der Server hat die Verbindung getrennt.&quot;,&quot;&quot;,MB_OK);
                    break;
                }
                else if( l_err == SOCKET_ERROR )
                { 
                     MessageBox(hwnd,&quot;Fehler.&quot;,&quot;&quot;,MB_OK);                 
                     break;
                } 

                render();  
            }
        }      
    }
</code></pre>
<p>Sobald ich recv() rausnehme läuft alles problemlos.<br />
Wenn ihr noch irgendwelchen Code sehen wollt sagt es einfach.</p>
<p>Gruss, joscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023711</guid><dc:creator><![CDATA[joscht]]></dc:creator><pubDate>Sat, 25 Mar 2006 14:03:30 GMT</pubDate></item></channel></rss>