TCP Array Problem

  • Hi,

    ich versuche grade einen TCP Multiclient Server zu erstellen. Jedoch wenn ich versuche überflüssige/nich verbundene Clients zu löschen dann bekomme ich eine Fehler weil die Zahl in der For schleife nicht mehr passt.

    Hier mal mein Server
    [autoit]

    #include<array.au3>

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

    Dim $aClients[1] = [0]
    Global $sIP = "127.0.0.1", $iPort = 1337, $iMainSocket
    TCPStartup()
    $iMainSocket = TCPListen($sIP, $iPort)

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

    While 1
    _AcceptClients($aClients)
    _DeleteClients($aClients)
    If $aClients[0] > 0 Then
    ;hier kommt der chat rein
    EndIf
    WEnd

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

    Func _DeleteClients(ByRef $aClients)
    For $i=1 to $aClients[0]
    TCPSend($aClients[$i], "[/Ping]"&@CRLF &@CRLF)
    $hTimer=TimerInit()
    Do
    $sRecv=TCPRecv($aClients[$i], 1)
    If TimerDiff($hTimer)>600 Then
    _ArrayDelete($aClients, $i)
    $aClients[0]-=1
    ;~ _ArrayDisplay($aClients)
    ConsoleWrite("Client gelöscht"&@CRLF)
    ContinueLoop 2
    EndIf
    Until $sRecv<>""
    Do
    $sRecv &= TCPRecv($aClients[$i], 1)
    Until @error or StringInStr($sRecv, "[/Pong]")
    Next
    EndFunc

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

    Func _AcceptClients(ByRef $aClients)
    $iTempClient = TCPAccept($iMainSocket)
    If $iTempClient <> -1 Then
    _ArrayAdd($aClients, $iTempClient)
    $aClients[0] += 1
    TCPSend($iTempClient, "[Console]Connected[/Console]"&@CRLF &@CRLF)
    ConsoleWrite("Client hinzugefügt"&@CRLF)
    ;~ _ArrayDisplay($aClients)
    EndIf
    EndFunc ;==>_AcceptClients

    [/autoit]

    Wenn jetzt in der Funktion _DeleteClients() ein Client rausgeschmissen wird dann setzt ich $aClients[0] um eine Zahl herunter jedoch versucht die For schleife in Zeile 21 immernoch bis zum Wert zu laufen den die Variable $aClients[0] zuvor hatte.

    Ich hoffe ihr habt Rat für mich :)

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

    Einmal editiert, zuletzt von monkey (21. Dezember 2010 um 19:04)

  • Hallo,

    hast Du das mal probiert? Damit brauchst Du für einen Multiclientserver keine For-Next-Schleifen.

    Alternativ kannst Du allerdings auch sowas machen:

    Spoiler anzeigen
    [autoit]

    Func _DeleteClients(ByRef $aClients)
    For $i=1 to $aClients[0]
    If $i >= UBound($aClients) Then ExitLoop ; <-- Notbremse
    TCPSend($aClients[$i], "[/Ping]"&@CRLF &@CRLF)
    $hTimer=TimerInit()
    Do
    $sRecv=TCPRecv($aClients[$i], 1)
    If TimerDiff($hTimer)>600 Then
    _ArrayDelete($aClients, $i)
    $aClients[0]-=1
    ;~ _ArrayDisplay($aClients)
    ConsoleWrite("Client gelöscht"&@CRLF)
    ContinueLoop 2
    EndIf
    Until $sRecv<>""
    Do
    $sRecv &= TCPRecv($aClients[$i], 1)
    Until @error or StringInStr($sRecv, "[/Pong]")
    Next
    EndFunc

    [/autoit]
  • Eine andere Möglichkeit wäre es mit einer Festen Max Useranzahl zu arbeiten.
    Dan müsstest du keine arrays löschen oder hinzufügen sonder nur für den login ein wert wie 0 oder 1 haben.
    Das hätte unter autoit auch den vorteil das das irgendwann nicht viel zu langsam wird.

  • mhm das wäre auch ne möglichkeit.
    Aber das war eig. sowieso nur ein Test wie ich nen multi client server mache, und ein chat war meine erste idee :)

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

  • wenn du willst kann ich dir was Schicken.
    Es ist der Prototyp des servers derf für meien banlist zuständig ist.