<?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[PingPong(wie im IRC) - Winsock - Wie umsetzen?]]></title><description><![CDATA[<p>Hi,<br />
ich habe folgendes Problem:</p>
<p>Ich habe einen Server und einen Client, und der Server muss die Möglichkeit haben festzustellen, ob der Client noch verbunden ist, das muss auch in Spezialsituationen wie Stromausfall etc. funktionieren.</p>
<p>Ich habe daher gedacht ich könnte es so wie im IRC machen: Ping...Pong...</p>
<p>Die Frage ist: Wie setze ich das am Besten mit Winsock um?</p>
<p>Danke<br />
PingPongMann</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209006/pingpong-wie-im-irc-winsock-wie-umsetzen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 12:20:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209006.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Mar 2008 16:59:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Tue, 25 Mar 2008 16:59:35 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe folgendes Problem:</p>
<p>Ich habe einen Server und einen Client, und der Server muss die Möglichkeit haben festzustellen, ob der Client noch verbunden ist, das muss auch in Spezialsituationen wie Stromausfall etc. funktionieren.</p>
<p>Ich habe daher gedacht ich könnte es so wie im IRC machen: Ping...Pong...</p>
<p>Die Frage ist: Wie setze ich das am Besten mit Winsock um?</p>
<p>Danke<br />
PingPongMann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480170</guid><dc:creator><![CDATA[PingPongMann]]></dc:creator><pubDate>Tue, 25 Mar 2008 16:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Tue, 25 Mar 2008 17:10:44 GMT]]></title><description><![CDATA[<p>Stell die Frage konkreter, so kann man nicht vernünftig antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480179</guid><dc:creator><![CDATA[^^]]></dc:creator><pubDate>Tue, 25 Mar 2008 17:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Tue, 25 Mar 2008 17:32:50 GMT]]></title><description><![CDATA[<p>Okay... Ich habe folgenden Code und möchte nun das besage PingPong programmieren. Wie muss ich den Code abändern?</p>
<p>Ich habe den Code der übersichthalber von <a href="http://c-worker.ch" rel="nofollow">c-worker.ch</a> genommen, da mein Code inzwischen schon sehr lang ist. Ich werde dann das Prinzip übernehmen. Danke</p>
<pre><code class="language-cpp">#pragma comment( lib, &quot;ws2_32.lib&quot; )

#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt; // bei manchan compilern muss man nur windows.h includieren (zB VC++)
#include &lt;stdio.h&gt;

#define MAX_CLIENTS 10

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&amp;wsa);
}

int main()
{
  long rc;
  SOCKET acceptSocket;
  //SOCKET connectedSocket;
  SOCKADDR_IN addr;
  char buf[256];
  char buf2[300];
  // zusätzliche Variabeln
  FD_SET fdSet;
  SOCKET clients[MAX_CLIENTS];
  int i;

  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf(&quot;Fehler: startWinsock, fehler code: %d\n&quot;,rc);
    return 1;
  }
  else
  {
    printf(&quot;Winsock gestartet!\n&quot;);
  }

  // Socket erstellen
  acceptSocket=socket(AF_INET,SOCK_STREAM,0);
  if(acceptSocket==INVALID_SOCKET)
  {
    printf(&quot;Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n&quot;,WSAGetLastError());
    return 1;
  }
  else
  {
    printf(&quot;Socket erstellt!\n&quot;);
  }

  // Socket binden
  memset(&amp;addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345);
  addr.sin_addr.s_addr=INADDR_ANY; // gewisse compiler brauchen hier ADDR_ANY
  rc=bind(acceptSocket,(SOCKADDR*)&amp;addr,sizeof(SOCKADDR_IN));
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;Fehler: bind, fehler code: %d\n&quot;,WSAGetLastError());
    return 1;
  }
  else
  {
    printf(&quot;Socket an port 12345 gebunden\n&quot;);
  }

  // In den listen Modus
  rc=listen(acceptSocket,10);
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;Fehler: listen, fehler code: %d\n&quot;,WSAGetLastError());
    return 1;
  }
  else
  {
    printf(&quot;acceptSocket ist im listen Modus....\n&quot;);
  }

  for(i=0;i&lt;MAX_CLIENTS;i++)
  {
    clients[i]=INVALID_SOCKET;
  }

  while(1)
  {
    FD_ZERO(&amp;fdSet); // Inhalt leeren
    FD_SET(acceptSocket,&amp;fdSet); // Den Socket der verbindungen annimmt hinzufügen

    // alle gültigen client sockets hinzufügen (nur die die nicht INVALID_SOCKET sind)
    for(i=0;i&lt;MAX_CLIENTS;i++)
    {
      if(clients[i]!=INVALID_SOCKET)
      {
        FD_SET(clients[i],&amp;fdSet);
      }
    }

    rc=select(0,&amp;fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben
    if(rc==SOCKET_ERROR)
    {
      printf(&quot;Fehler: select, fehler code: %s\n&quot;,WSAGetLastError());
      return 1;
    }

    // acceptSocket is im fd_set? =&gt; verbindung annehmen (sofern es platz hat)
    if(FD_ISSET(acceptSocket,&amp;fdSet)) {
      // einen freien platz für den neuen client suchen, und die verbingung annehmen
      for(i=0;i&lt;MAX_CLIENTS;i++)
      {
        if(clients[i]==INVALID_SOCKET)
        {
          clients[i]=accept(acceptSocket,NULL,NULL);
          printf(&quot;Neuen Client angenommen (%d)\n&quot;,i);
          break;
        }
      }
    }

    // prüfen wlecher client sockets im fd_set sind
    for(i=0;i&lt;MAX_CLIENTS;i++)
    {
      if(clients[i]==INVALID_SOCKET)
      {
        continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array
      }
      if(FD_ISSET(clients[i],&amp;fdSet))
      {
        rc=recv(clients[i],buf,256,0);
        // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat
        if(rc==0 || rc==SOCKET_ERROR)
        {
          printf(&quot;Client %d hat die Verbindung geschlossen\n&quot;,i);
          closesocket(clients[i]); // socket schliessen         
          clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
        }
        else
        {
          buf[rc]='\0';
          // daten ausgeben und eine antwort senden
          printf(&quot;Client %d hat folgendes gesandt: %s\n&quot;,i,buf);
          // antwort senden
          sprintf(buf2,&quot;Du mich auch %s\n&quot;,buf);
          send(clients[i],buf2,(int)strlen(buf2),0);
		}
	  }
	}
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1480196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480196</guid><dc:creator><![CDATA[PingPongMann]]></dc:creator><pubDate>Tue, 25 Mar 2008 17:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Wed, 26 Mar 2008 16:49:09 GMT]]></title><description><![CDATA[<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480819</guid><dc:creator><![CDATA[xXxXxXxXxXx]]></dc:creator><pubDate>Wed, 26 Mar 2008 16:49:09 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Wed, 26 Mar 2008 16:50:53 GMT]]></title><description><![CDATA[<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
</blockquote>
<p>Falsch, -100 Punkte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480823</guid><dc:creator><![CDATA[^^]]></dc:creator><pubDate>Wed, 26 Mar 2008 16:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Thu, 27 Mar 2008 17:56:53 GMT]]></title><description><![CDATA[<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
</blockquote>
<p>Falsch, -100 Punkte.</p>
</blockquote>
<p>Beweis mir das Gegenteil du Hochstapler!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481619</guid><dc:creator><![CDATA[xXxXxXxXxXx]]></dc:creator><pubDate>Thu, 27 Mar 2008 17:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Thu, 27 Mar 2008 18:33:32 GMT]]></title><description><![CDATA[<p>du sendest dem client ein ping-paket, dessen inhalt und form du selbst bestimmst. meine empfehlung: die ping-kennung (z.b. als string &quot;PING&quot;), einen timecode (z.b. von GetTickCount()) und eine sequenznummer (beliebig, z.b. eine zufallszahl).<br />
die sequenznummer dient als sicherheit, damit man dir nicht so einfach ein gefälschtes oder ungültiges pong unterschieben kann. wie du die generierst ist egal, der server muss sie sich nur merken bis das pong zurückkommt oder bis zum time-out.</p>
<p>diese daten schickst du an den client. der tut nichts anderes als aus dem &quot;PING&quot; ein &quot;PONG&quot; zu machen und das ganze wieder zurückzuschicken.</p>
<p>der server merkt sich alle gesendeten pings in einer liste. erhält er ein passendes pong, prüft er die sequenznummer. stimmt sie überein, ist der client noch am leben. das ping wird aus der liste enfernt. aus dem timecode kannst du dir dann die signallaufzeit ausrechnen.<br />
kommt innerhalb von 30 (oder x) sekunden kein pong, ist der client tot.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481645</guid><dc:creator><![CDATA[vorschlag]]></dc:creator><pubDate>Thu, 27 Mar 2008 18:33:32 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Thu, 27 Mar 2008 19:59:02 GMT]]></title><description><![CDATA[<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
</blockquote>
<p>Falsch, -100 Punkte.</p>
</blockquote>
<p>Beweis mir das Gegenteil du Hochstapler!</p>
</blockquote>
<p>Da hab ich keine Lust zu, da es offensichtlich ist das es geht.^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481692</guid><dc:creator><![CDATA[^^]]></dc:creator><pubDate>Thu, 27 Mar 2008 19:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Thu, 27 Mar 2008 20:55:39 GMT]]></title><description><![CDATA[<p>vorschlag schrieb:</p>
<blockquote>
<p>du sendest dem client ein ping-paket, dessen inhalt und form du selbst bestimmst. meine empfehlung: die ping-kennung (z.b. als string &quot;PING&quot;), einen timecode (z.b. von GetTickCount()) und eine sequenznummer (beliebig, z.b. eine zufallszahl).<br />
die sequenznummer dient als sicherheit, damit man dir nicht so einfach ein gefälschtes oder ungültiges pong unterschieben kann. wie du die generierst ist egal, der server muss sie sich nur merken bis das pong zurückkommt oder bis zum time-out.</p>
<p>diese daten schickst du an den client. der tut nichts anderes als aus dem &quot;PING&quot; ein &quot;PONG&quot; zu machen und das ganze wieder zurückzuschicken.</p>
<p>der server merkt sich alle gesendeten pings in einer liste. erhält er ein passendes pong, prüft er die sequenznummer. stimmt sie überein, ist der client noch am leben. das ping wird aus der liste enfernt. aus dem timecode kannst du dir dann die signallaufzeit ausrechnen.<br />
kommt innerhalb von 30 (oder x) sekunden kein pong, ist der client tot.</p>
</blockquote>
<p>Das hatte ich auch vor, es hinkt jedoch an der <em>kompletten</em> Umsetzung. Genau aus dem Grund bitte ich auch um Code. Ich hab bisher immer aus Code gelernt, jedoch fehlt mir für diesen konkreten Fall ein Beispielcode.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481736</guid><dc:creator><![CDATA[PingPongMann]]></dc:creator><pubDate>Thu, 27 Mar 2008 20:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Sat, 29 Mar 2008 21:31:20 GMT]]></title><description><![CDATA[<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
</blockquote>
<p>Falsch, -100 Punkte.</p>
</blockquote>
<p>Beweis mir das Gegenteil du Hochstapler!</p>
</blockquote>
<p>Da hab ich keine Lust zu, da es offensichtlich ist das es geht.^^</p>
</blockquote>
<p>Sieht schlecht für dich aus^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482890</guid><dc:creator><![CDATA[Klaus^^^^]]></dc:creator><pubDate>Sat, 29 Mar 2008 21:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to PingPong(wie im IRC) - Winsock - Wie umsetzen? on Sat, 29 Mar 2008 21:34:36 GMT]]></title><description><![CDATA[<p>Klaus^^^^ schrieb:</p>
<blockquote>
<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>^^ schrieb:</p>
<blockquote>
<p>xXxXxXxXxXx schrieb:</p>
<blockquote>
<p>Sowas lässt sich mit Winsock leider nicht realisieren, sonst hättest du auch schon eine Antwort erhalten.</p>
</blockquote>
<p>Falsch, -100 Punkte.</p>
</blockquote>
<p>Beweis mir das Gegenteil du Hochstapler!</p>
</blockquote>
<p>Da hab ich keine Lust zu, da es offensichtlich ist das es geht.^^</p>
</blockquote>
<p>Sieht schlecht für dich aus^^</p>
</blockquote>
<p>^^ roflé</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482893</guid><dc:creator><![CDATA[^^]]></dc:creator><pubDate>Sat, 29 Mar 2008 21:34:36 GMT</pubDate></item></channel></rss>