<?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[Sockets: mehrere clients.  das wäre sehr nett wenn ihr mir helfen könntet büdde]]></title><description><![CDATA[<p>ich habe den beispielcode von <a href="http://www.c-worker.ch/tuts/select.php" rel="nofollow">http://www.c-worker.ch/tuts/select.php</a> genommen<br />
da geht es um einen chat-server und -client:</p>
<p>server:</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>
<p>client:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;
#include &lt;stdio.h&gt;

//Prototypen
int startWinsock(void);
long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);

int main(int argc, char** argv)
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[256];

  if(argc&lt;2)
  {
    printf(&quot;Usage: sock &lt;hostname oder ip des servers&gt;\n&quot;);
    return 1;
  }

  // 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
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s==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;);
  }

  // Verbinden
  memset(&amp;addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
  rc=getAddrFromString(argv[1],&amp;addr);
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;IP für %s konnte nicht aufgeloest werden\n&quot;, argv[1]);
    return 1;
  }
  else
  {
    printf(&quot;IP aufgeloest!\n&quot;);
  }

  rc=connect(s,(SOCKADDR*)&amp;addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;Fehler: connect gescheitert, fehler code: %d\n&quot;,WSAGetLastError());
    return 1;
  }
  else
  {
    printf(&quot;Verbunden mit 127.0.0.1..\n&quot;);
  }

  // Daten austauschen
  while(rc!=SOCKET_ERROR)
  {
    printf(&quot;\nZeichenfolge eingeben [max 256]: &quot;);
    gets(buf);
    send(s,buf,strlen(buf),0);
    rc=recv(s,buf,256,0);
    if(rc==0)
    {
      printf(&quot;Server hat die Verbindung getrennt..\n&quot;);
      break;
    }
    if(rc==SOCKET_ERROR)
    {
      printf(&quot;Fehler: recv, fehler code: %d\n&quot;,WSAGetLastError());
      break;
    }
    buf[rc]='\0';
    printf(&quot;\nServer antwortet: %s\n&quot;,buf);
  }
  closesocket(s);
  WSACleanup();
  return 0;
}

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

long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)

{
  long rc;
  unsigned long ip;
  HOSTENT* he;

  /* Parameter prüfen */
  if(hostnameOrIp==NULL || addr==NULL)
    return SOCKET_ERROR;

  /* eine IP in hostnameOrIp ? */
  ip=inet_addr(hostnameOrIp);

  /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
  if(ip!=INADDR_NONE)
  {
    addr-&gt;sin_addr.s_addr=ip;
    return 0;
  }
  else
  {
    /* Hostname in hostnameOrIp auflösen */
    he=gethostbyname(hostnameOrIp);
    if(he==NULL)
    {
      return SOCKET_ERROR;
    }
    else
    {
      /*die 4 Bytes der IP von he nach addr kopieren */
      memcpy(&amp;(addr-&gt;sin_addr),he-&gt;h_addr_list[0],4);
    }
    return 0;

  }
}
</code></pre>
<p>meine frage ist: ist es möglich bei dem server für jeden clienten ein neues fenster zu öffnen damit man den chatt voll ausnutzen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161176/sockets-mehrere-clients-das-wäre-sehr-nett-wenn-ihr-mir-helfen-könntet-büdde</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 13:52:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161176.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Oct 2006 08:51:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sockets: mehrere clients.  das wäre sehr nett wenn ihr mir helfen könntet büdde on Wed, 04 Oct 2006 08:54:16 GMT]]></title><description><![CDATA[<p>ich habe den beispielcode von <a href="http://www.c-worker.ch/tuts/select.php" rel="nofollow">http://www.c-worker.ch/tuts/select.php</a> genommen<br />
da geht es um einen chat-server und -client:</p>
<p>server:</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>
<p>client:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;
#include &lt;stdio.h&gt;

//Prototypen
int startWinsock(void);
long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);

int main(int argc, char** argv)
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[256];

  if(argc&lt;2)
  {
    printf(&quot;Usage: sock &lt;hostname oder ip des servers&gt;\n&quot;);
    return 1;
  }

  // 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
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s==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;);
  }

  // Verbinden
  memset(&amp;addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
  rc=getAddrFromString(argv[1],&amp;addr);
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;IP für %s konnte nicht aufgeloest werden\n&quot;, argv[1]);
    return 1;
  }
  else
  {
    printf(&quot;IP aufgeloest!\n&quot;);
  }

  rc=connect(s,(SOCKADDR*)&amp;addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf(&quot;Fehler: connect gescheitert, fehler code: %d\n&quot;,WSAGetLastError());
    return 1;
  }
  else
  {
    printf(&quot;Verbunden mit 127.0.0.1..\n&quot;);
  }

  // Daten austauschen
  while(rc!=SOCKET_ERROR)
  {
    printf(&quot;\nZeichenfolge eingeben [max 256]: &quot;);
    gets(buf);
    send(s,buf,strlen(buf),0);
    rc=recv(s,buf,256,0);
    if(rc==0)
    {
      printf(&quot;Server hat die Verbindung getrennt..\n&quot;);
      break;
    }
    if(rc==SOCKET_ERROR)
    {
      printf(&quot;Fehler: recv, fehler code: %d\n&quot;,WSAGetLastError());
      break;
    }
    buf[rc]='\0';
    printf(&quot;\nServer antwortet: %s\n&quot;,buf);
  }
  closesocket(s);
  WSACleanup();
  return 0;
}

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

long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)

{
  long rc;
  unsigned long ip;
  HOSTENT* he;

  /* Parameter prüfen */
  if(hostnameOrIp==NULL || addr==NULL)
    return SOCKET_ERROR;

  /* eine IP in hostnameOrIp ? */
  ip=inet_addr(hostnameOrIp);

  /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
  if(ip!=INADDR_NONE)
  {
    addr-&gt;sin_addr.s_addr=ip;
    return 0;
  }
  else
  {
    /* Hostname in hostnameOrIp auflösen */
    he=gethostbyname(hostnameOrIp);
    if(he==NULL)
    {
      return SOCKET_ERROR;
    }
    else
    {
      /*die 4 Bytes der IP von he nach addr kopieren */
      memcpy(&amp;(addr-&gt;sin_addr),he-&gt;h_addr_list[0],4);
    }
    return 0;

  }
}
</code></pre>
<p>meine frage ist: ist es möglich bei dem server für jeden clienten ein neues fenster zu öffnen damit man den chatt voll ausnutzen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149061</guid><dc:creator><![CDATA[neoexpert]]></dc:creator><pubDate>Wed, 04 Oct 2006 08:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets: mehrere clients.  das wäre sehr nett wenn ihr mir helfen könntet büdde on Wed, 04 Oct 2006 09:42:35 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149092</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 04 Oct 2006 09:42:35 GMT</pubDate></item></channel></rss>