ServerSocket->Socket->Connections wie bekomme den Index eines Clients?



  • Ich benutze C++ Builder 6 professional, OS win2k und versuche einen deamon zu programmieren. Ich habe das problem das ich beim ServerSocket nicht weiss wie ich den Index eines Clients bekomme dem ich was zusende?

    Wenn es da nichts für gibt um bei OnClient* events den Index zu bekommen dann kann man ja theoretisch mitzählen aber wie verhält sich der Index sagen wir wenn ich 2 clients mit Index 1 und 2 habe und der Client 1 disconnected? Ist dann die 2 die 1?



  • Morgen!

    Zulan schrieb:

    dann kann man ja theoretisch mitzählen

    Mitzählen brauchst du nicht, du kannst auch einfach

    ServerSocket1->Socket->ActiveConnections
    

    nehmen.

    Zulan schrieb:

    aber wie verhält sich der Index sagen wir wenn ich 2 clients mit Index 1 und 2 habe und der Client 1 disconnected? Ist dann die 2 die 1?

    Ich gehe mal davon aus,das der 2. Client dann auf den Index 1 geht.
    Du kannst natürlich auch hingehen und dir einfach vom entsprechenden Client das

    ServerSocket1->Socket->SocketHandle
    

    merken und einfach nach diesem Handle in deinen Connections suchen und beim Treffer dann senden.



  • PuppetMaster2k schrieb:

    Zulan schrieb:

    dann kann man ja theoretisch mitzählen

    Mitzählen brauchst du nicht, du kannst auch einfach

    ServerSocket1->Socket->ActiveConnections
    

    nehmen.

    Ja das ist schön und gut aber das sagt mir ja nur die Anzahl aller aktiven Connections. Das hilft mir leider wenig wenn ich verschiedene Clients connected hab.

    PuppetMaster2k schrieb:

    Du kannst natürlich auch hingehen und dir einfach vom entsprechenden Client das

    ServerSocket1->Socket->SocketHandle
    

    merken und einfach nach diesem Handle in deinen Connections suchen und beim Treffer dann senden.

    Hat nicht der ServerSocket nur ein Handle? Korrigier mich wenn ich falsch liege aber das ServerSocket->Socket bzw. das Socket das ich bei on_client_* events mitbekomme ist doch immer das selbe oder? Bis auch den Wert von ActiveConnections. In der Hilfe steht ja auch:

    Mit der Methode Listen oder Open kann SocketHandle ein gültiges Windows-Socket-Handle zugewiesen werden.

    Das würde heissen das sich wärend ein Socket offen ist das Handle nicht ändert.

    Trotzdem danke. Wenn ich mist geschrieben hab korrigier mich bitte.



  • Hi!

    Es ist folgendermaßen, jeder Client der sich bei deinem ServerSocket anmeldet bekommt ein eindeutiges SocketHandle zugewiesen, vergleichbar beispielsweise mit einer IP-Adresse fürs internet. Da hat auch jeder eine andere. Auch dein ServerSocket hat ein SocketHandle, das sich wiederum vom rest unterscheidet.
    Die SocketHandles der Clients bekommst du z.B. von den übergebenen Sockets in den verschiedenen Events oder durch

    ServerSocket1->Socket->Connections[i]->SocketHandle
    

    Mit deiner letzten aussage hast du recht, solange der Socket offen ist, kann dessen Handle nicht verändert werden.



  • Hi Zulan

    Hast du Lust mir bei meinem Problem behilflich zu sein ?

    Ich mache gerade auch Netzwerkprogrammierung und suche jemanden der mir bei meinen Fragen behilflich sein kann.

    Kannst du dafür eine EMail an mich schreiben ?

    mo@edvwl.de

    Danke

    Gruß

    Mo



  • Ok danke dann versuche ich mal folgendes:

    ServerSocket OnClientConnect
    MyClientHandle = Socket->Connections[Socket->ActiveConnections-1]->SocketHandle;
    

    und umm dann die ID wiederzufinden iteriere ich durch die connections und vergleiche. Ist das so logisch sinnvoll?

    @MO

    Zum einen solltest du da wohl eher PuppetMaster fragen und ausserdem habe ich atm leider keine Zeit.. Zu viel stress 😞

    thx

    Zulan



  • Zulan schrieb:

    Ist das so logisch sinnvoll?

    Genau so würd ich es auch machen 🙂



  • Es funzt tatsächlich 🙂

    Kumpel hat mir noch bei OOP geholfen und jetz funzts ohne probs.. Es gibt nur eine theoretische schwachstelle...

    Ich merke mir das handle nicht beim ServerSocketClientConnect sondern beim ~Read....

    Ich gehe also davon aus das zwischen connect und read nicht noch einer connected.. sonst wirds blöd weil ich beim read ja auch nur die information habe welches handle der letze socket hat.. und nix allgemeines...

    Thx 🙂



  • ich blick des immer noch net so richtig
    SocketHandle ist ja vom Typ Integer, aber des bringt mir doch nix wenn ich des als Index bei Connections nehm???

    kann mal bitte jemand ein Code Beispiel machen bei dem man einzelne Clients ansprechen kann, auch wenn inzwischen jemand disconnected hat



  • _Michi schrieb:

    ich blick des immer noch net so richtig
    SocketHandle ist ja vom Typ Integer, aber des bringt mir doch nix wenn ich des als Index bei Connections nehm???

    kann mal bitte jemand ein Code Beispiel machen bei dem man einzelne Clients ansprechen kann, auch wenn inzwischen jemand disconnected hat

    Mit Vergnügen:

    Das Handle wird bei ServerSocketClientRead so gelesen:

    ServerSocket->Socket->Connections[ServerSocket->Socket->ActiveConnections - 1]->Handle
    

    Und dann suche ich das so:

    for (int x = 0; x < Form1->ServerSocket->Socket->ActiveConnections; x++)
                    if (Form1->ServerSocket->Socket->Connections[x]->Handle == fSockets[id].sdHandle) {
                            Form1->ServerSocket->Socket->Connections[x]->SendText(buff);
                            break;
                    }
    

Anmelden zum Antworten