<?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 ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i)]]></title><description><![CDATA[<p>Hallo, ich versuche mich gerade etwas mit Netzwerkkommunikation über Sockets anzufreunden, um eigentlixch ein einfaches Chatprogramm zu schreiben.</p>
<p>Dabei verbinden sich beliebig viele Clients mit dem Server, dieser speichert in einer Map den übermittelten Username als Schlüssel und die Ip, bzw. den Username und die Verbindungsnummer aus dem Feld</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Connections[i]
</code></pre>
<p>Ferner sendet der Server den Clients die anderen Nutzernamen (also von den restlichen Clients) und verteilt die Nachrichten von den Clients ggf. weiter an die restlichen Sockets.</p>
<p>So weit so gut.</p>
<p>Alledings wollte ich verhindern, daß mehere Nutzer den gleichen Nutzernamen (Username) besitzen, deshalb wird im folgenden Ereignis geguckt, ob der Nutzername bereits auftritt und wenn dem so ist wird mit</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Disconnect(i)
</code></pre>
<p>diese Verbindung wieder verbinden.<br />
So ist zumindest die Idee, allerdings wird nicht nur der gewünschte Client disconnected sondern auch alle anderen, bei allen Clients wird das Ereignis</p>
<pre><code class="language-cpp">ClientSocketDisconnect
</code></pre>
<p>aufgerufen.<br />
Dabei dachte ich, ich kann mit</p>
<pre><code class="language-cpp">Disconnect(i)
</code></pre>
<p>nur zu dem entsprechenden Client die Verbindung trennen.</p>
<p>Wenn jemand eine Idee hat oder mir irgendwie weiterhelfen könnte wär das ganz nett <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Hier ist mal das ganze Ereignis:</p>
<pre><code class="language-cpp">void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString nachricht=Socket-&gt;ReceiveText();
  bool ausgeben=true;
  if (nachricht.Length()&gt;=4)
  {
        AnsiString befehl=nachricht.SubString(1,4);
        if (befehl==&quot;§USN&quot;) // Username
        {
          ausgeben=false;
          //Zur Kontrolle, ob der Name bereits verwendet wird.
          bool vorhanden=false;
          if (nachricht.SubString(5,nachricht.Length()-4)!=getUserName())
          {
            std::map&lt;AnsiString,AnsiString&gt;::iterator iter2=VerbindungenIp.begin();
            while ((iter2!=VerbindungenIp.end())&amp;&amp;(vorhanden==false))
            {
              if (iter2-&gt;first==nachricht.SubString(5,nachricht.Length()-4))
              {
                 vorhanden=true;
              }
              iter2++;
            }
          }
          else
          {
            vorhanden=true;
          }

          // Speichern des Nutzernamens und weitersenden an die Clients

          int i=0;
          while (ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;RemoteAddress!=Socket-&gt;RemoteAddress)
          {
            i++;
          }
          if (vorhanden==false)
          {
            ComboBox1-&gt;Items-&gt;Add(nachricht.SubString(5,nachricht.Length()-4));
            setVerbindungN(nachricht.SubString(5,nachricht.Length()-4),i);
            setVerbindungIp(nachricht.SubString(5,nachricht.Length()-4),ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;RemoteAddress);

            int j=0;
            while (j&lt;ServerSocket-&gt;Socket-&gt;ActiveConnections)
            {
              if (j!=i)
              {
                ServerSocket-&gt;Socket-&gt;Connections[j]-&gt;SendText(&quot;§USN&quot;
                + nachricht.SubString(5,nachricht.Length()-4));
              }
              j++;
            }
            std::map&lt;AnsiString,int&gt;::iterator iter3=VerbindungenN.begin();
            while (iter3!=VerbindungenN.end())
            {
              if (iter3-&gt;second!=i)
              {
                ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;SendText(&quot;§USN&quot;
                + iter3-&gt;first);
              }
              iter3++;
            }
          }
          else   // Um mehrdeutige Nutzernamen zu verhindern
          {
            ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;SendText(&quot;Ihr Benutzername wird bereits verwendet.&quot;);

//  :arrow_right: SO HIER SOLLTE MEIN PROBLEM LIEGEN:

            ServerSocket-&gt;Socket-&gt;Disconnect(i);            
          }

        }
        else if (befehl==&quot;§STU&quot;)    // Send to user
        {
        // Weiter senden an
        // §STUALLNachricht oder §STUNUTZERNAME§Nachricht in der Nachricht ist bereits der ursprüngliche Nutzername vorangestellt

          AnsiString adressat=nachricht.SubString(5,3);
          if (adressat==&quot;ALL&quot;)
          {
            std::map&lt;AnsiString,int&gt;::iterator iter=VerbindungenN.begin();
            while (iter!=VerbindungenN.end())
            {
              if (VerbindungenIp[iter-&gt;first]!=Socket-&gt;RemoteAddress)
              {
                ServerSocket-&gt;Socket-&gt;Connections[iter-&gt;second]-&gt;SendText(nachricht.SubString(8,nachricht.Length()-7));
              }
              iter++;
            }
            nachricht=nachricht.SubString(8,nachricht.Length()-7);
          }
          else
          {
            int i=6;
            adressat=nachricht.SubString(5,1);
            befehl=nachricht.SubString(i,1);  // die Variable befehl wird nun als einzelnes Zeichen verwendet!
            for (i=7;(i&lt;nachricht.Length())&amp;&amp;(befehl!=&quot;§&quot;);i++)
            {
              adressat=adressat+befehl;
              befehl=nachricht.SubString(i,1);
            }
            if (adressat!=getUserName())
            {
              ServerSocket-&gt;Socket-&gt;Connections[VerbindungenN[adressat&rsqb;&rsqb;-&gt;SendText(nachricht.SubString(i,nachricht.Length()-i+1));
            }
            nachricht=nachricht.SubString(i,nachricht.Length()-i+1);
          }
        }
  }
  if (ausgeben==true)
  {RichEdit1-&gt;Lines-&gt;Add(nachricht);}

  DebugenAusgabe(); // Säter löschen

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/85306/probleme-mit-serversocket-gt-socket-gt-disconnect-i</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 01:57:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/85306.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Sep 2004 15:07:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 15:07:37 GMT]]></title><description><![CDATA[<p>Hallo, ich versuche mich gerade etwas mit Netzwerkkommunikation über Sockets anzufreunden, um eigentlixch ein einfaches Chatprogramm zu schreiben.</p>
<p>Dabei verbinden sich beliebig viele Clients mit dem Server, dieser speichert in einer Map den übermittelten Username als Schlüssel und die Ip, bzw. den Username und die Verbindungsnummer aus dem Feld</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Connections[i]
</code></pre>
<p>Ferner sendet der Server den Clients die anderen Nutzernamen (also von den restlichen Clients) und verteilt die Nachrichten von den Clients ggf. weiter an die restlichen Sockets.</p>
<p>So weit so gut.</p>
<p>Alledings wollte ich verhindern, daß mehere Nutzer den gleichen Nutzernamen (Username) besitzen, deshalb wird im folgenden Ereignis geguckt, ob der Nutzername bereits auftritt und wenn dem so ist wird mit</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Disconnect(i)
</code></pre>
<p>diese Verbindung wieder verbinden.<br />
So ist zumindest die Idee, allerdings wird nicht nur der gewünschte Client disconnected sondern auch alle anderen, bei allen Clients wird das Ereignis</p>
<pre><code class="language-cpp">ClientSocketDisconnect
</code></pre>
<p>aufgerufen.<br />
Dabei dachte ich, ich kann mit</p>
<pre><code class="language-cpp">Disconnect(i)
</code></pre>
<p>nur zu dem entsprechenden Client die Verbindung trennen.</p>
<p>Wenn jemand eine Idee hat oder mir irgendwie weiterhelfen könnte wär das ganz nett <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Hier ist mal das ganze Ereignis:</p>
<pre><code class="language-cpp">void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString nachricht=Socket-&gt;ReceiveText();
  bool ausgeben=true;
  if (nachricht.Length()&gt;=4)
  {
        AnsiString befehl=nachricht.SubString(1,4);
        if (befehl==&quot;§USN&quot;) // Username
        {
          ausgeben=false;
          //Zur Kontrolle, ob der Name bereits verwendet wird.
          bool vorhanden=false;
          if (nachricht.SubString(5,nachricht.Length()-4)!=getUserName())
          {
            std::map&lt;AnsiString,AnsiString&gt;::iterator iter2=VerbindungenIp.begin();
            while ((iter2!=VerbindungenIp.end())&amp;&amp;(vorhanden==false))
            {
              if (iter2-&gt;first==nachricht.SubString(5,nachricht.Length()-4))
              {
                 vorhanden=true;
              }
              iter2++;
            }
          }
          else
          {
            vorhanden=true;
          }

          // Speichern des Nutzernamens und weitersenden an die Clients

          int i=0;
          while (ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;RemoteAddress!=Socket-&gt;RemoteAddress)
          {
            i++;
          }
          if (vorhanden==false)
          {
            ComboBox1-&gt;Items-&gt;Add(nachricht.SubString(5,nachricht.Length()-4));
            setVerbindungN(nachricht.SubString(5,nachricht.Length()-4),i);
            setVerbindungIp(nachricht.SubString(5,nachricht.Length()-4),ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;RemoteAddress);

            int j=0;
            while (j&lt;ServerSocket-&gt;Socket-&gt;ActiveConnections)
            {
              if (j!=i)
              {
                ServerSocket-&gt;Socket-&gt;Connections[j]-&gt;SendText(&quot;§USN&quot;
                + nachricht.SubString(5,nachricht.Length()-4));
              }
              j++;
            }
            std::map&lt;AnsiString,int&gt;::iterator iter3=VerbindungenN.begin();
            while (iter3!=VerbindungenN.end())
            {
              if (iter3-&gt;second!=i)
              {
                ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;SendText(&quot;§USN&quot;
                + iter3-&gt;first);
              }
              iter3++;
            }
          }
          else   // Um mehrdeutige Nutzernamen zu verhindern
          {
            ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;SendText(&quot;Ihr Benutzername wird bereits verwendet.&quot;);

//  :arrow_right: SO HIER SOLLTE MEIN PROBLEM LIEGEN:

            ServerSocket-&gt;Socket-&gt;Disconnect(i);            
          }

        }
        else if (befehl==&quot;§STU&quot;)    // Send to user
        {
        // Weiter senden an
        // §STUALLNachricht oder §STUNUTZERNAME§Nachricht in der Nachricht ist bereits der ursprüngliche Nutzername vorangestellt

          AnsiString adressat=nachricht.SubString(5,3);
          if (adressat==&quot;ALL&quot;)
          {
            std::map&lt;AnsiString,int&gt;::iterator iter=VerbindungenN.begin();
            while (iter!=VerbindungenN.end())
            {
              if (VerbindungenIp[iter-&gt;first]!=Socket-&gt;RemoteAddress)
              {
                ServerSocket-&gt;Socket-&gt;Connections[iter-&gt;second]-&gt;SendText(nachricht.SubString(8,nachricht.Length()-7));
              }
              iter++;
            }
            nachricht=nachricht.SubString(8,nachricht.Length()-7);
          }
          else
          {
            int i=6;
            adressat=nachricht.SubString(5,1);
            befehl=nachricht.SubString(i,1);  // die Variable befehl wird nun als einzelnes Zeichen verwendet!
            for (i=7;(i&lt;nachricht.Length())&amp;&amp;(befehl!=&quot;§&quot;);i++)
            {
              adressat=adressat+befehl;
              befehl=nachricht.SubString(i,1);
            }
            if (adressat!=getUserName())
            {
              ServerSocket-&gt;Socket-&gt;Connections[VerbindungenN[adressat&rsqb;&rsqb;-&gt;SendText(nachricht.SubString(i,nachricht.Length()-i+1));
            }
            nachricht=nachricht.SubString(i,nachricht.Length()-i+1);
          }
        }
  }
  if (ausgeben==true)
  {RichEdit1-&gt;Lines-&gt;Add(nachricht);}

  DebugenAusgabe(); // Säter löschen

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/601745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/601745</guid><dc:creator><![CDATA[GeraldR]]></dc:creator><pubDate>Tue, 07 Sep 2004 15:07:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 16:08:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;Disconnect();
</code></pre>
<p>Sollte dein Problem lösen. Über deinen Code wird die Verbindung vom Server für *alle* beendet, auch die eigene.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/601785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/601785</guid><dc:creator><![CDATA[PuppetMaster2k]]></dc:creator><pubDate>Tue, 07 Sep 2004 16:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 16:54:53 GMT]]></title><description><![CDATA[<p>Das hatte ich auch schon versucht, leider kommt bei</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;Disconnect();
</code></pre>
<p>Folgende Compilerfehlermeldungen:</p>
<p>[C++ Error] Dsa1.cpp(345): E2193 Too few parameters in call to '_fastcall TCustomWinSocket::Disconnect(int)'<br />
[C++ Error] Dsa1.cpp(360): E2096 Illegal structure operation</p>
<p>Anscheindend muß immernoch ein Parameter vom Typ int übergeben werden</p>
<pre><code class="language-cpp">ServerSocket-&gt;Socket-&gt;Connections[i]-&gt;Disconnect(i);
</code></pre>
<p>das macht allerdnings nicht wirklich Sinn, es wird zwar vom Compiler abzeptiert, allerdings zeigt es auch überhaupt keine Wirkung im Programm.<br />
:o(</p>
]]></description><link>https://www.c-plusplus.net/forum/post/601820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/601820</guid><dc:creator><![CDATA[GeraldR]]></dc:creator><pubDate>Tue, 07 Sep 2004 16:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 17:16:10 GMT]]></title><description><![CDATA[<p>Ich hab das so gelöst das wenn sich jemand anmeldet, dessen Nick aber schon vergeben ist, der Server einen Nachricht schickt von wegen ###ClientDisconnect#. Wenn der Client dies erhält führt er &quot;ClientSocket1-&gt;Close();&quot; aus und in seinem Event bei Disconnect startet er dann z.B. das Formular um sich neu anzumelden bzw. eines wo er seinen Nick neu eingeben muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/601837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/601837</guid><dc:creator><![CDATA[PlayazOnly]]></dc:creator><pubDate>Tue, 07 Sep 2004 17:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 19:57:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    ServerSocket1-&gt;Socket-&gt;Connections[i]-&gt;Disconnect(Socket-&gt;SocketHandle);
}
</code></pre>
<p>So sollte es aussehen und funktionieren. Das hättest du aber mit lesen in der Hilfe und ein bischen Nachdenken schon selber geschaft <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>
]]></description><link>https://www.c-plusplus.net/forum/post/601969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/601969</guid><dc:creator><![CDATA[PuppetMaster2k]]></dc:creator><pubDate>Tue, 07 Sep 2004 19:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Tue, 07 Sep 2004 20:53:34 GMT]]></title><description><![CDATA[<p>Dann erstmal danke, werd morgen mal ausprobieren, wäre abersicher erstmal nicht darauf gekommen ,da icvh mit handles nicht so auskenne, hab dazu nur mal ein kleines Kapitel gelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/602007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/602007</guid><dc:creator><![CDATA[GeraldR]]></dc:creator><pubDate>Tue, 07 Sep 2004 20:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit ServerSocket-&amp;gt;Socket-&amp;gt;Disconnect(i) on Wed, 08 Sep 2004 06:14:19 GMT]]></title><description><![CDATA[<p>Du solltest vom Gedanken &quot;oh, da kennich mich nicht aus, das schnall ich eh nicht&quot; zum Gedanken &quot;oh, da kenn ich mich noch nicht aus. Lesen wir trotzdem mal ein bischen drüber&quot; wechseln. Wenn dieser Schritt vollzogen ist, dann kriegt man sowas mit HIlfetexten auch raus (o;</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/602114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/602114</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 08 Sep 2004 06:14:19 GMT</pubDate></item></channel></rss>