TCP Multiuser Programm

  • Nach laaanger Zeit melde ich mich auch mal wieder. Mache seit einigen Monaten wieder bischen mit AutoIt und stehe nun vor einem Problem.

    TCP P2P ist kein Problem, ob es nun Text oder Dateien sind, allerdings habe ich ein Problem mit einem Multiuser Support, mit anderen Worten: 1 Server und mehr als 1 Client.

    Ich hab ein Script von gtaspider gefunden, welches ebenfalls Multiuser unterstützten sollte, hab allerdings nicht ganz durchgeblickt, welches nun die ausschlaggebende Stelle ist. (Link)


    Wäre super, wenn mir jemand das nochmal genauer erläutern könnte, wie ich das berwergstelligen kann. Danke im Voraus.

  • Das einfachste wird wohl sein, auf die TCP-UDF umzusteigen. Dabei werden nicht die AutoIt-TCP Funktionen verwendet, sondern alles über DLL-Calls gehandhabt ( man sieht aber nichts davon :) )

  • ich glaub, dass das hier der richtige ansatz sein sollte ;) du hast dann für jeden client der kommt ein array.

    Spoiler anzeigen
    [autoit]

    Global $Clients[1]

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

    TCPStartup()

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

    $MainSocket = TCPListen(@IPAddress1, 1234)
    If $MainSocket = -1 Then Exit

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

    Do
    $Connect = TCPAccept($MainSocket)
    Until $Connect <> -1
    $Clients[0] = $Connect

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

    While 1
    $Connect = TCPAccept($MainSocket)
    If $Connect >= 0 Then
    ReDim $Clients[UBound($Clients)+1]
    $Clients[UBound($Clients)-1] = $Connect
    EndIf

    For $i = 0 To UBound($Clients)-1
    $Recv = TCPRecv($Clients[$i],2048)
    If $Recv <> "" Then
    $split = StringSplit($Recv,"|")
    If $split[1] = "MSG" Then
    MsgBox(0,"", $split[2])
    EndIf
    EndIf
    Next
    WEnd

    [/autoit]
  • Hab mal versucht, eine TCP-Server-UDF ohne Events zu machen :)

    Spoiler anzeigen
    [autoit]

    ;UDF Variables
    Global $TCP_Clients_Connected[1]
    Global $TCP_Clients_LastID = 0
    Global $TCP_Clients_LastRecv
    ; UDF Variables End

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

    ;Example Start
    TCPStartup()

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

    $MainSocket = _TCP_Server_Create()
    If $MainSocket = -1 Then Exit

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

    _TCP_Server_WaitForClient($MainSocket)

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

    While 1
    _TCP_Server_AcceptClient($MainSocket)

    $client = _TCP_Server_SendingClient($MainSocket)
    If $client > -1 Then
    $data = _TCP_Server_RecvClientData($client,-1) ; Get all data
    MsgBox(0, 'Received', $data)
    EndIf
    WEnd

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

    Func OnAutoItExit()
    _TCP_Server_Stop($MainSocket)
    TCPShutdown()
    EndFunc
    ;Example End

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

    ; UDf Functions
    Func _TCP_Server_Stop(ByRef $MainSocket)
    For $i = 0 To UBound($TCP_Clients_Connected)-1
    TCPCloseSocket($TCP_Clients_Connected[$i])
    Next
    Return TCPCloseSocket($MainSocket)
    EndFunc

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

    Func _TCP_Server_Create($IP = "",$Port=1234)
    Return TCPListen($IP,$Port)
    EndFunc

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

    Func _TCP_Server_DisconnectClient($client)
    If $client >= UBound($TCP_Clients_Connected) Or $client < 0 Then Return 0
    Return TCPCloseSocket($TCP_Clients_Connected[$client])
    EndFunc

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

    Func _TCP_Server_SendClientData($Client,$data)
    If $client >= UBound($TCP_Clients_Connected) Or $client < 0 Then Return 0
    Return TCPSend($TCP_Clients_Connected[$client],$data)
    EndFunc

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

    Func _TCP_Server_RecvClientData($Client,$maxlen=2048,$Binary=0)
    If $client >= UBound($TCP_Clients_Connected) Or $client < 0 Then Return ""
    Local $recv, $temprecv
    If $TCP_Clients_LastID == $client Then
    $recv = $TCP_Clients_LastRecv
    $TCP_Clients_LastRecv = ""
    EndIf
    If $maxlen = -1 Then
    While 1
    $temprecv = TCPRecv($TCP_Clients_Connected[$client],2048,$Binary)
    If @error Then $TCP_Clients_Connected[$client] = -1
    If $temprecv = "" Then ExitLoop
    $recv &= $temprecv
    WEnd
    Else
    $recv &= TCPRecv($TCP_Clients_Connected[$client],$maxlen,$Binary)
    EndIf
    Return $recv
    EndFunc

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

    Func _TCP_Server_SendingClient($MainSocket,$Binary=0)
    If $TCP_Clients_LastID > UBound($TCP_Clients_Connected)-1 Then $TCP_Clients_LastID = 0
    For $i = $TCP_Clients_LastID To UBound($TCP_Clients_Connected)-1
    $TCP_Clients_LastRecv = TCPRecv($TCP_Clients_Connected[$i],10,$Binary)
    $TCP_Clients_LastID = $i
    If $TCP_Clients_LastRecv <> "" Then Return $i
    Next
    Return -1
    EndFunc

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

    Func _TCP_Server_AcceptClient($MainSocket)
    Local $Connect = TCPAccept($MainSocket)
    If $Connect >= 0 Then
    ReDim $TCP_Clients_Connected[UBound($TCP_Clients_Connected)+1]
    $TCP_Clients_Connected[UBound($TCP_Clients_Connected)-1] = $Connect
    Return UBound($TCP_Clients_Connected)-1
    EndIf
    Return -1
    EndFunc

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

    Func _TCP_Server_WaitForClient($MainSocket)
    Local $first, $Connect
    If UBound($TCP_Clients_Connected) = 1 Then $first = True
    Do
    $Connect = _TCP_Server_AcceptClient($MainSocket)
    Until $Connect >= 0
    If $first Then
    $TCP_Clients_Connected[0] = $TCP_Clients_Connected[1]
    ReDim $TCP_Clients_Connected[1]
    EndIf
    Return UBound($TCP_Clients_Connected)-1
    EndFunc

    [/autoit]
  • ich glaub, dass das hier der richtige ansatz sein sollte ;) du hast dann für jeden client der kommt ein array.

    Du meinst doch wohl ein Feld in einem Array, oder? Ich bedanke mich schonmal für die Codeschnipsel und Ideen, ich werd mich da morgen durchfressen.