TCP Client/Sockets wiederverwenden

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von WeLoveBurgers.

    TCP Client/Sockets wiederverwenden

    Hey,
    Ich möchte gern meine tcp clients/sockets wiederverwenden, das funktioniert soweit gut, mein bisheriges konzept:
    • Erstelle eine concurent bag(avaiabletouse)
    • hau xx neue tcp clients rein
    • holen per TryTake, in eine temporäre Liste
    • Asyncrones starten des connectens via client.BeginConnect
    • sobald connected aus Liste removen, in neue concurent bag(connectet_towork)
    • nachdem der tcpjob erledigt wurde darf ich den "NetworkStream" nicht beenden, da sonst der tcp client disposed wird, genau sowenig darf ich den client per "close schließen"(kommt aufs selbe raus), aus den gründen verwende ich hier ".client.Client.Disconnect(true)"
    • danach wird der tcpclient wieder in die avaiabletouse bag geschmissen.

    Soweit sogut, nun hab ich das Problem, dass die clients austimen können, das machen sie nicht von selber, sondern ich muss da einen timestamp anhängen.
    Das problem ist, dass ich die clients nicht disconnecten kann ohne den socket unbrauchbar zu machen.
    Zur zeit mach ich folgendes:

    C#-Quellcode

    1. cliarr[i].client.Client.Close(0);
    2. cliarr[i].client.Close();
    3. usableclients.Add(new TcpClient());

    #EDIT: Kleine info am rande: Wenn ich endconnect aufrufe kommt diese fehlermeldung: "Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte "
    "Hat den Nachteil, dass da neue sockets erstellt werden und die alten noch lange offen bleiben, selbst nach dem Close.
    Ich hoffe ich habe das annähernd verständlich ausgedrückt :)
    Weis da jemand wie ich mein Problem lösen könnte?

    *Topic verschoben*
    Wer Rechtschreibfehler findet darf sie behalten :)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()

    WeLoveBurgers schrieb:

    tcp clients/sockets wiederverwenden
    ist nicht unbedingt sinnvoll.
    Erstell für jede einzelne Nachricht eine neue Instanz unsd feddich. So wird es auch in den Microsoft-Beispielen demonstriert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    WeLoveBurgers schrieb:

    Das problem ist, dass ich die clients nicht disconnecten kann ohne den socket unbrauchbar zu machen.
    Ist das wirklich ein Problem?
    In meinen Übungen mit TcpClient ist disconnecte ich ausschließlich mittels TcpClient.Dispose(), und wiederverwendet wird da natürlich nix.

    WeLoveBurgers schrieb:

    "Hat den Nachteil, dass da neue sockets erstellt werden und die alten noch lange offen bleiben, selbst nach dem Close.
    Wo ist diese Information her?
    Das würde ja grundlegenden Programmier-Prinzipien widersprechen, bzw. ist ja sogar sprachlich paradox: "ein closed Socket, der offen bleibt".
    @RodFromGermany &
    @ErfinderDesRades

    Das ist so geregelt, schon alleine von windows her, wenn man socket.close() macht, bleibt der socket belegt für 4 minuten um noch "nachzügler" abzufangen, das bezieht sich jetzt auf timed-out connections, es kann ja immer mal sein dass ein server länger braucht als der timeout des clientens.

    Wenn ich über Tcpclient.Client.Disconnect(true) gehe, bleibt der socket benutzbar, klar wenn beide seiten(client und server) die connection geschlossen haben.
    Wer Rechtschreibfehler findet darf sie behalten :)