Server Client, ExistVerbindung?

  • Hallo,
    bin gerade 2 kleine Skripts am schreiben.
    Ich möchte ein Server - Client Programm schreiben, soweit alles gut.
    Hin und her schicken, also senden und empfangen klappt, aber wie kann ich überprüfen, ob der client oder Server noch existiert.
    Wenn ich den Client neustarte funktioniert der Austausch nicht mehr.
    Jemand eine Idee?

  • Ok, da du tcp nicht von hand machst.. gelten trotzdem die gleichen Regeln..

    Client beenden und wieder neu starten, heisst auch.. das die Verbindung
    nach Client beenden auch wieder erneut aufgebaut werden muss. Sollte
    dein Server das nicht mitbekommen, das die Verbindung futsch ist.. weist
    du jetzt wo du ansetzen kannst :o)

    Lg,

    Pustekuchen

  • Sorry hab die Frage falsch verstanden.
    Mit TCPAccept und TCPConnect wird die Verbindung zugelassen.
    Dachte, wenn TCPAccept(oder auf der Clientseite TCPConnect) >=0 ist, das einfach die aktuelle Listen beendet wird und neugestartet.
    Hab ich einen Fehler?

  • Du musst immer @error nach TCPSend und TCPRecv prüfen.
    Ist dieser nicht 0, wurde der Client oder Server beendet bzw. ist aus irgendeinem Grund nicht erreichbar.

    Clientside müsstest du dann mit TCPConnect einen neuen Verbindungsversuch machen. Vom Server aus, TCPAccept...

    Einmal editiert, zuletzt von $var (10. Oktober 2012 um 22:22)

  • Also eines der ersten nützlichen Dinge die mir hier gesagt wurden war..

    Poste deinen Quelltext.. und es kann dir geholfen werden weil man es
    vieleicht versteht was du da probierst :o)

    Lg,

    Pustekuchen

  • Alles klar, danke.
    Daran hab ich gar nicht gedacht.
    Kann also eine Pseudonachricht abschicken und nur testen, ob die Gegenseite noch antwortet.
    Kann man auch 2 oder mehr Clients verbinden?

  • Wenn du ein Array verwendest, kannst du 'beliebig' viele Clients connecten lassen.
    Der Umgang damit erfordert aber etwas Erfahrung und natürlich logisches Denken. ;)

  • Hi,
    habe mal einige Zeilen aus DeskStream kopiert, dort machen wir das so:
    Client:

    [autoit]

    $sresv = TCPRecv($iConnect, 1) ;ein zeichen aus dem puffer holen
    If @error Then ;verbindung zum server verloren
    MsgBox(16, "DeskStream 2 Client", "Verbindung unterbrochen.")
    ExitLoop
    EndIf

    [/autoit]


    Server:
    Ineinandergeschachtelte Loops, der "äußere" arbeitet die etablierten Verbindungen ab, falls einer der Clients die Verbindung beendet, wird das durch einen @ERROR bei TCPRecv() erkannt und der Socket geschlossen, der Server wartet dann auf weitere Verbindungen.

    Spoiler anzeigen
    [autoit]


    While 1 ;äusserer loop

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10) ;warten auf Client
    If $iConnection = -1 Then $iConnection = TCPAccept($iSock); client hat sich verbunden
    If $iConnection <> -1 Then ExitLoop
    WEnd
    ;hauptschleife
    While 1 ;Sleep(10)
    ;blabla
    TCPSend($iConnection, Hex($zoom_w) & Hex($zoom_h))
    While Sleep(10) ;Verbindung zu client besteht
    $sResv = TCPRecv($iConnection, 2) ;Daten empfangen
    ;blabla
    WEnd
    ;blabla
    ;blabla
    Do ;warten auf client
    $a = TCPRecv($iConnection, 1, 1); BinärDaten holen
    If @error Then ExitLoop 2 ;springt zu XXXXX
    If $a <> "" Then $recv &= Hex($a, 2)
    Until StringLen($recv) = (2 * $structsize) ;es wurde etwas gesendet
    ;blabla
    WEnd
    ;XXXXX
    ;blabla
    TCPCloseSocket($iConnection)
    $iConnection = -1
    WEnd

    [/autoit]

    //EDIT// ist nicht von der Multiclient-Variante, aber wenn man überhaupt verstanden hat, was man tut (bzw. tun muss) ist der Rest ja einfach...