Client Server mit CAsyncSocket



  • Hallo

    Ich habe ein kleines Client Server Verständnisproblem.

    Auf einem PC läuft ein Server der auf Port 4000 auf Clients wartet.
    Wenn ein Client kommt, erstelle ich ein Thread und baue eine Verbindung zum Client.
    Wenn ein zweiter Client kommt, erstelle ich wieder ein Thread. Doch bei diesem kann ich den Client nicht akzeptieren!
    Also die Verbindung zwischen Server und "Client 2" kann nicht aufgebaut werden.
    Kann das sein, weil der Client 1 schon mit dem Server über Port 4000 kommuniziert?

    Muss ich für jeden Client einen Port definieren? Ich hoffe mal nicht. Weil sonst müsste ich jeden Client-Port auf meinem Router forwarden.

    Wie kann ich das lösen?



  • Nö. Du machst einen Socket, bindest den auf 4000 (bind()), und schaltest ihn dann auch "listening" (listen()).
    Dann kannst du Verbindungen mit diesem Socket annehmen, und zwar mittels accept.
    Von accept bekommst du dann ja einen neuen Socket zurück der mit dem Client verbunden ist, der erste Socket bleibt dabei auf Port 4000 gebunden und weiterhin "listening".

    Das ganze könnte (grob, schematisch) dann etwa so aussehen:

    SOCKET s = socket(...);
    bind(s, ...);
    listen(s, ...);
    while(1)
    {
        SOCKET s2 = accept(s, ...);
        StartConnectionThread(s2, ...);
    }
    

    EDIT: oops, CAsyncSocket - da wird das wohl etwas anders gehen. Obwohl, am grundsätzlichen Ablauf wird sich wohl nix ändern...



  • Wenn du CAsyncSocket benutzt brauchst du keinen Thread pro Verbindung.



  • Wieso keine Threads?
    Bei diesem Tool handelt es sich um einen Chat.
    Am Server befindet sich auch ein User der mit denn anderen chattet.
    Clients kennen eigentlich nur den Server.
    Sie senden Nachrichten an ihn und er verteilt diese dann an alle anderen Clients.
    Und wenn zwei Clients zur gleichen Zeit etwas senden wäre es doch besser das pro Client ein Thread die Nachricht empfängt.
    Oder nicht?



  • Ob du hier Threads verwendest oder nicht sollte bei kleinen Userzahlen ziemlich egal sein. Für grössere ist es sicherlich schlauer ohne Threads zu arbeiten, da ein Thread garnicht wenig Resourcen frisst.



  • c+-: Rate mal, wieso das Ding CAsyncSocket heißt...



  • Ok. Danke für die Hilfe.
    Ich werde mal CAsyncSocket ein wenig genauer anschauen. 🙂


Anmelden zum Antworten