<?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[Probleme mit SOCKETS und UDP]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte endlich mal richtig mit Sockets arbeiten, aber natürlich mit UDP denn<br />
TCP/IP kann ich für Spiele absolut nicht gebrauchen weil das ja zu langsam ist.</p>
<p>Ich hab mir schon einige Beispiele angesehen und verstehe zum Teil schon mal das Grundprinzip.<br />
Allerdings kommt bei meinem SocketTest keine Nachricht mehr zurück wenn ich UDP verwende.</p>
<pre><code class="language-cpp">// Mit TCP/IP mache ich das so:
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Mit UDP mache ich das so:
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
</code></pre>
<p>Das müsste schon mal soweit richtig sein oder?!</p>
<pre><code class="language-cpp">// Das hab ich aus einem Tutorial, funktioniert auch mit TCP/IP wenn ich das an &quot;192.168.2.1&quot; (mein Router) schicke
char msg[1024] = &quot;GET / HTTP/1.1\r\nHost: www.example.net\r\n\r\n&quot;;

// Result ist bei UDP leider immer -1
int result = recv(sock, msg, sizeof(msg) - 1, 0);
</code></pre>
<p>Wenn euch das an Code nicht reicht, hier ist noch mal der ganze Code:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;cstdlib&gt; // für exit()
#include &lt;unistd.h&gt; // für close()
#include &lt;string&gt; // für memset()

#include &lt;winsock2.h&gt;

using namespace std;

int main(void) {

    WSADATA wsa;
    int result;

    // starting winsock
    result = WSAStartup(0x0002, &amp;wsa); // 0x0002 for Windows 2.0, 0x0101 for Win 1.1
    if (result) { // WinSock API error handling
        printf(&quot;Error: WSAStartup, &quot;);
        switch(result) {
            case WSASYSNOTREADY:     printf(&quot;WinSock not ready\n&quot;);                             break;
            case WSAVERNOTSUPPORTED: printf(&quot;requested WinSock version not supported\n&quot;);       break;
            case WSAEINPROGRESS:     printf(&quot;blocking WinSock 1.1 operation in progress\n&quot;);    break;
            case WSAEPROCLIM:        printf(&quot;maximum WinSock tasks reached\n&quot;);                 break;
            case WSAEFAULT:          printf(&quot;The lpWSAData is not a valid pointer\n&quot;);          break;
            default:                 printf(&quot;Unknown error code: %d\n&quot;, result);                break;
        }
        return result;
    }

    // main rutine

    SOCKET sock;

    // wir holen uns den descriptor für einen socket (soll mal TCP/IP werden)

    // int socket(int domain { AF_INET, PF_INET, PF_INET6, PF_IPX, PF_PACKET } , int type { SOCK_DGRAM, SOCK_STREAM } , int protocol );

    // !!! Hier ist TCP/IP und UDP !!!
    #if 1
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // UDP
    #else
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP/IP
    #endif

    if (sock == -1 ) {
        perror(&quot;could not create socket\n&quot;);
        system(&quot;PAUSE&quot;);
        exit(1);
    } else
        printf(&quot;create socket successful\n&quot;);

    // Strukur anlegen, mit Nullen füllen und initialisieren
    sockaddr_in dest_addr;
    memset(&amp;dest_addr, 0, sizeof(dest_addr));                   // alles mit Nullen füllen
    dest_addr.sin_family        = AF_INET;                      // muss hier nochmal stehen
    dest_addr.sin_port          = htons(80);                    // auf dem Port läuft meistens HTTP
    dest_addr.sin_addr.s_addr   = inet_addr(&quot;192.168.2.1&quot;);     // IP Addresse von www.example.net

    // verbinden
    if (connect(sock, (sockaddr*)&amp;dest_addr, sizeof(sockaddr)) == -1) {
        perror(&quot;could not connet to 192.168.2.1:80\n&quot;);
        system(&quot;PAUSE&quot;);
        exit(2);
    } else
        printf(&quot;connection successful\n&quot;);

    // eine Nachricht senden
    char msg[1024] = &quot;GET / HTTP/1.1\r\nHost: www.example.net\r\n\r\n&quot;;
    // blockierende Funktion (wartet bis alle Daten gesendet wurden)
    result = send(sock, msg, strlen(msg), 0);
    if (result == -1) {
        perror(&quot;couldn't send data&quot;);
        system(&quot;PAUSE&quot;);
        exit(3);
    }
    if (result &lt; (signed)strlen(msg)) { // eigentlich kein Fehler, aber für diese Zwecke lassen wir es einen sein
        perror(&quot;couldn't send all data&quot;);
        system(&quot;PAUSE&quot;);
        exit(4);
    }

    do {
        // blockierende Funktion, wartet solange bis eine Antwort kommt (Daten, Fehler, Verbindung beendet)
        result = recv(sock, msg, sizeof(msg)-1, 0);
        if (result == 0) {
            puts(&quot;\r\nconnection terminated by server\n&quot;);
            break;
        } else if (result == -1) {
            perror(&quot;recv() error&quot;);
            //system(&quot;PAUSE&quot;);
            //exit(5);
            result = 1;
        } else {
            msg[result] = 0; // string terminieren
            puts(msg);
        }
    } while (result &gt; 0);

    // close socket
    close(sock);

    WSACleanup();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Kann mir jemand sagen was ich falsch mache oder was da noch fehlt?</p>
<p>Danke schon mal <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/topic/219054/probleme-mit-sockets-und-udp</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 13:27:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219054.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jul 2008 10:33:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 10:33:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte endlich mal richtig mit Sockets arbeiten, aber natürlich mit UDP denn<br />
TCP/IP kann ich für Spiele absolut nicht gebrauchen weil das ja zu langsam ist.</p>
<p>Ich hab mir schon einige Beispiele angesehen und verstehe zum Teil schon mal das Grundprinzip.<br />
Allerdings kommt bei meinem SocketTest keine Nachricht mehr zurück wenn ich UDP verwende.</p>
<pre><code class="language-cpp">// Mit TCP/IP mache ich das so:
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Mit UDP mache ich das so:
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
</code></pre>
<p>Das müsste schon mal soweit richtig sein oder?!</p>
<pre><code class="language-cpp">// Das hab ich aus einem Tutorial, funktioniert auch mit TCP/IP wenn ich das an &quot;192.168.2.1&quot; (mein Router) schicke
char msg[1024] = &quot;GET / HTTP/1.1\r\nHost: www.example.net\r\n\r\n&quot;;

// Result ist bei UDP leider immer -1
int result = recv(sock, msg, sizeof(msg) - 1, 0);
</code></pre>
<p>Wenn euch das an Code nicht reicht, hier ist noch mal der ganze Code:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;cstdlib&gt; // für exit()
#include &lt;unistd.h&gt; // für close()
#include &lt;string&gt; // für memset()

#include &lt;winsock2.h&gt;

using namespace std;

int main(void) {

    WSADATA wsa;
    int result;

    // starting winsock
    result = WSAStartup(0x0002, &amp;wsa); // 0x0002 for Windows 2.0, 0x0101 for Win 1.1
    if (result) { // WinSock API error handling
        printf(&quot;Error: WSAStartup, &quot;);
        switch(result) {
            case WSASYSNOTREADY:     printf(&quot;WinSock not ready\n&quot;);                             break;
            case WSAVERNOTSUPPORTED: printf(&quot;requested WinSock version not supported\n&quot;);       break;
            case WSAEINPROGRESS:     printf(&quot;blocking WinSock 1.1 operation in progress\n&quot;);    break;
            case WSAEPROCLIM:        printf(&quot;maximum WinSock tasks reached\n&quot;);                 break;
            case WSAEFAULT:          printf(&quot;The lpWSAData is not a valid pointer\n&quot;);          break;
            default:                 printf(&quot;Unknown error code: %d\n&quot;, result);                break;
        }
        return result;
    }

    // main rutine

    SOCKET sock;

    // wir holen uns den descriptor für einen socket (soll mal TCP/IP werden)

    // int socket(int domain { AF_INET, PF_INET, PF_INET6, PF_IPX, PF_PACKET } , int type { SOCK_DGRAM, SOCK_STREAM } , int protocol );

    // !!! Hier ist TCP/IP und UDP !!!
    #if 1
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // UDP
    #else
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP/IP
    #endif

    if (sock == -1 ) {
        perror(&quot;could not create socket\n&quot;);
        system(&quot;PAUSE&quot;);
        exit(1);
    } else
        printf(&quot;create socket successful\n&quot;);

    // Strukur anlegen, mit Nullen füllen und initialisieren
    sockaddr_in dest_addr;
    memset(&amp;dest_addr, 0, sizeof(dest_addr));                   // alles mit Nullen füllen
    dest_addr.sin_family        = AF_INET;                      // muss hier nochmal stehen
    dest_addr.sin_port          = htons(80);                    // auf dem Port läuft meistens HTTP
    dest_addr.sin_addr.s_addr   = inet_addr(&quot;192.168.2.1&quot;);     // IP Addresse von www.example.net

    // verbinden
    if (connect(sock, (sockaddr*)&amp;dest_addr, sizeof(sockaddr)) == -1) {
        perror(&quot;could not connet to 192.168.2.1:80\n&quot;);
        system(&quot;PAUSE&quot;);
        exit(2);
    } else
        printf(&quot;connection successful\n&quot;);

    // eine Nachricht senden
    char msg[1024] = &quot;GET / HTTP/1.1\r\nHost: www.example.net\r\n\r\n&quot;;
    // blockierende Funktion (wartet bis alle Daten gesendet wurden)
    result = send(sock, msg, strlen(msg), 0);
    if (result == -1) {
        perror(&quot;couldn't send data&quot;);
        system(&quot;PAUSE&quot;);
        exit(3);
    }
    if (result &lt; (signed)strlen(msg)) { // eigentlich kein Fehler, aber für diese Zwecke lassen wir es einen sein
        perror(&quot;couldn't send all data&quot;);
        system(&quot;PAUSE&quot;);
        exit(4);
    }

    do {
        // blockierende Funktion, wartet solange bis eine Antwort kommt (Daten, Fehler, Verbindung beendet)
        result = recv(sock, msg, sizeof(msg)-1, 0);
        if (result == 0) {
            puts(&quot;\r\nconnection terminated by server\n&quot;);
            break;
        } else if (result == -1) {
            perror(&quot;recv() error&quot;);
            //system(&quot;PAUSE&quot;);
            //exit(5);
            result = 1;
        } else {
            msg[result] = 0; // string terminieren
            puts(msg);
        }
    } while (result &gt; 0);

    // close socket
    close(sock);

    WSACleanup();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Kann mir jemand sagen was ich falsch mache oder was da noch fehlt?</p>
<p>Danke schon mal <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/1555530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555530</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Tue, 29 Jul 2008 10:33:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 11:59:50 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>ich möchte endlich mal richtig mit Sockets arbeiten, aber natürlich mit UDP denn<br />
TCP/IP kann ich für Spiele absolut nicht gebrauchen weil das ja zu langsam ist.</p>
</blockquote>
<p>Absoluter Quark!<br />
Es kommt ganz auf das Spiel und die Menge an Daten an. UDP wird aber oft gewählt, weil es in Netzwerken und bei Firewalls einige Vorteile bietet. Der zusätzliche Overhead von TCP fällt selten wirklich ins Gewicht. TCP ist allerdings deutlich leichter zu benutzen als UDP.</p>
<p>Ob der Code funktioniert oder nicht, kann ich nicht gleich sagen, nur was mich stutzig macht, ist die HTTP Anweisung mit UDP. Soweit ich weiss geht HTTP nur über TCP, weshalb dein Router wahrscheinlich nicht antwortet.</p>
<p>Im übrigen übermittelst du jede Menge Schrott, welcher wahrscheinlich auch noch Probleme macht. Du übermittelst 1023 Zeichen, wovon du aber nur eine ganz kleine Anzahl benutzt. Den Rest lässt du auf einem uninitialisierten Zustand, wodurch irgendwelche Zeichen übermittelt werden. Das kann ja fast nicht gut gehen.</p>
<p>Und noch was fällt mir auf. Mit UDP und Winsock braucht man doch andere send und receive Funktionen. War doch sowas wie send_to und receive_from. Dafür fiel doch das connect weg. Irgendwas in der Art, am besten machst du mal ein Tutorial zu Winsocks durch.<br />
<a href="http://www.c-worker.ch/tuts/udp.php" rel="nofollow">http://www.c-worker.ch/tuts/udp.php</a><br />
Ist zwar für C, aber wieso nicht.</p>
<p>Und falls du eine API haben möchtest, welche in C++ ist und Platformunabhängig, wäre noch Boost.Asio zu empfehlen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555598</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 29 Jul 2008 11:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 12:03:46 GMT]]></title><description><![CDATA[<p>Wenn es eh ein Spiel werden soll, kann man sich natürlich auch SDL in Verbindung mit SDL_net anschauen. Oder Qt verwenden etc. pp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555603</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 29 Jul 2008 12:03:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 12:05:37 GMT]]></title><description><![CDATA[<p>Noch was ist mir in den Sinn gekommen, das editier ich jetzt nicht rein, da Fellhuhn schon geantwortet hat. Du bist im falschen Forum!<br />
Winsockets ist WinAPI und somit:<br />
<a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555607</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 29 Jul 2008 12:05:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 13:00:47 GMT]]></title><description><![CDATA[<p>Danke schön Dravere <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="🙂"
    /><br />
Das Tutorial sieht schon mal sehr hilfreich aus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555656</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Tue, 29 Jul 2008 13:00:47 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 13:19:19 GMT]]></title><description><![CDATA[<p>Aber noch mal ne kurze Frage - (ich will dafür jetzt nicht extra noch mal einen Thread aufmachen):</p>
<p>ist die Funktion <strong>recvfrom</strong> auch einen blokierende Funktion?<br />
Das wäre nämlich sau unpraktisch <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="😞"
    /><br />
Wenn das Programm nämlich gerade eine Nachricht empfangen will, aber es kommt keine mehr, hängt sich das Programm auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555670</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Tue, 29 Jul 2008 13:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SOCKETS und UDP on Tue, 29 Jul 2008 13:54:47 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>ist die Funktion <strong>recvfrom</strong> auch einen blokierende Funktion?</p>
</blockquote>
<p>Das weiss ich auch nicht, wir sind ja nicht im WinAPI Forum. Aber das könntest du auch selber in der MSDN nachschlagen:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms740120(VS.85).aspx" rel="nofollow">MSDN: recvfrom</a><br />
Da steht:</p>
<blockquote>
<p>If no incoming data is available at the socket, the recvfrom function blocks and waits for data to arrive according to the blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking.</p>
</blockquote>
<p>LukasBanana schrieb:</p>
<blockquote>
<p>Das wäre nämlich sau unpraktisch <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="😞"
    /><br />
Wenn das Programm nämlich gerade eine Nachricht empfangen will, aber es kommt keine mehr, hängt sich das Programm auf.</p>
</blockquote>
<p>Deshalb lagert man eigentlich oft solche Sachen in Threads aus. Die recv Funktion ist übrigens auch blockierend, kannst du auch in der MSDN nachlesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555706</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 29 Jul 2008 13:54:47 GMT</pubDate></item></channel></rss>