Array per TCP senden und empfangen!

  • Hey leute, wiedermal ein Problem!

    Gibt es einen Befehl bei AutoIT, mit dem ich Arrays versenden kann??

    mein Beispiel:

    [autoit]


    Local $var[2][2]
    $var[1][0]= '4'
    Msgbox (0,"",$var[1][0])

    [/autoit]

    und nu will ich diesen Arraywert der sich in $var befindet über TCP möglichst einfach verschicken... einfaches Versenden des wertes geht leider nicht, das hab ich schon ausprobiert...:(

    Man könnte es natürlich nen bisschen komplizierter machen und mit`n paar schleifen jede einzelne "information" senden, so dass sie dann bei dem Empfänger wieder in ein Array geschrieben wird, aber es is doch umständlich und unschön...:(

    also kann mir da jemand helfen??

    vielen dank! :rock: :rock: :rock: :rock:

    2 Mal editiert, zuletzt von Mr_gitarre (14. Mai 2010 um 12:41)

  • Du kannst mit TCP kein Array verschicken. Endwerder du wandelst ihn in einen String um, ober versendest jedes Element einzeln (Schleifen).

    Spoiler anzeigen
    [autoit]

    Func TCPSend2DArray($Array, $Socket, $PassWort) ;~ Array versenden
    Local $Array = _Array2DString($Array)
    Local $Array = _Array2DCrypt(1, $Array, $PassWort) ;~ Array verschlüsseln

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

    TCPSend($Socket, "ARRAY_DIMS:" & UBound($Array) & ";" & UBound($Array, 2))

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

    For $Durchlauf = 0 To UBound($Array)
    For $Durchlauf2 = 0 To UBound($Array, 2)
    TCPSend($Socket, "ARRAY:" & $Durchlauf & "." & $Durchlauf2 & ";DATA:" & $Array[$Durchlauf][$Durchlauf2])
    Next
    Next

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

    TCPSend($Socket, "ARRAY_SEND_FINSCH")
    EndFunc ;==>TCPSend2DArray

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Array2DCrypt()
    ; Description ...: Verschlüsselt einen 2 Dilmensionalen Array.
    ; Syntax ........: _Array2DCrypt($Crypt, $Array, $PassWort)
    ; Parameters ....: $Crypt- Verschlüsseln? (1 = ja, 0 = nein)
    ; $Array- Der Array, der verschlüsselt wird.
    ; $PassWort - Das Passwort zum verschlüsseln.
    ; Return values .: Der verschlüsselte Array
    ; Author ........: Magnus Kühn
    ; Note...........: Benötigt die String-UDF
    ; =================================================================================================

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

    Func _Array2DCrypt($Crypt, $Array, $PassWort)
    Local $AltArray = _Array2DString($Array)
    Local $NewArray[UBound($AltArray)][UBound($AltArray, 2)]

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

    For $Durchlauf = 0 To UBound($AltArray) - 1
    For $Durchlauf2 = 0 To UBound($AltArray, 2) - 1
    $NewArray[$Durchlauf][$Durchlauf2] = _StringEncrypt($Crypt, $AltArray[$Durchlauf][$Durchlauf2], $PassWort, 1)
    Next
    Next

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

    Return $NewArray
    EndFunc ;==>_Array2DCrypt

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Array2DString()
    ; Description ...: Konvertiert alle Ellemente einen 2 Dilmensionalen Array in Strings.
    ; Syntax ........: _Array2DString($Array)
    ; Parameters ....: $Array- Der Array, der konvertiert wird.
    ; Return values .: Der verschlüsselte Array
    ; Author ........: Magnus Kühn
    ; =================================================================================================

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

    Func _Array2DString($Array)
    Local $NewArray[UBound($Array)][UBound($Array, 2)]

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

    For $Durchlauf = 0 To UBound($Array) - 1
    For $Durchlauf2 = 0 To UBound($Array, 2) - 1
    $NewArray[$Durchlauf][$Durchlauf2] = String($Array[$Durchlauf][$Durchlauf2])
    Next
    Next

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

    Return $NewArray
    EndFunc ;==>_Array2DString

    [/autoit]


    Mit der ersten Funktion versendest du einen Array. Die zweite (alle Elemente des Arrays in Strings umwandeln) und die dritte (Array ver-/entschlüsseln) Funktionen werden von der 1. benötigt.

    Die Daten kannst du so empfangen:

    Spoiler anzeigen
    [autoit]

    Global $TCPSendArray = "" ;~ Anpassen!
    Global $TCPSendArrayPass = "Passwort" ;~ Anpassen!
    Global $TCPSendArraySocket = "" ;~ Anpassen!

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

    While 1 ;~ Daten empfangen
    $String = TCPRecv($TCPSendArraySocket, 1024)
    If $String <> "" Then
    $SplitOut = StringSplit($String, ":", 2) ;~ Daten teilen

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

    If Not IsArray($SplitOut) Then ;~ Fehler prüfen
    If $String == "ARRAY_SEND_FINSCH" Then
    Global $TCPSendArray = _Array2DCrypt(0, $TCPSendArray, $TCPSendArrayPass)

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

    If $SplitOut[0] == "ARRAY_DIMS" Then ;~ Array-Imformationen empfangen
    $Split = StringSplit($SplitOut[1], ";", 2)
    Global $TCPSendArray[$Split[0]][$Split[1]]

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

    ElseIf IsArray($TCPSendArray) Then
    $Split = StringSplit($String, ";", 2)
    Dim $Split[2] = [StringSplit($Split[0], ":", 2), StringSplit($Split[1], ":", 2)]

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

    If $Split2[0][0] == "ARRAY" Then ;~ Daten empfangen
    $Split2 = StringSplit($Split[0][1], ".", 2)

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

    $TCPSendArray[$Split2[0]][$Split2[1]] = $Split2[1][1] ;~ Daten speichern
    EndIf
    EndIf
    EndIf
    WEnd

    [/autoit]

    Es geht nur mit 2 Zweidimensionalen Arrays.

    Magnus

  • Man könnte es natürlich nen bisschen komplizierter machen und mit`n paar schleifen jede einzelne "information" senden, so dass sie dann bei dem Empfänger wieder in ein Array geschrieben wird, aber es is doch umständlich und unschön...:(

    Warum? Das ist die beste Methode.

    Magnus