Mehrere TCP Befehle sende/empfangen

  • Hallo
    Ich habe ein problem. Also ich Sende an ein AVR-NET-IO ein Befehl Getport 1 der mir sagt ob der digitale eingang 1 oder 0 ist.
    Wenn ich nur einen Port abfrage geht das ohne Probleme, aber mehrere ports auf einmal bekomme ich nicht hin.
    Ich will quasi alle paar Sekunden alle Ports abfragen (Getport 1, Getport 2, Getport 3 und Getport 4) und die antworten jeweils in Variablen speichern.
    Gibt es da irgendeinen Weg das in AutoIT zu realisieren?

    Local $ConnectedSocket, $szData
    Local $szIPADDRESS = "192.168.0.90"
    Local $nPORT = 50290

    While 1

    TCPStartup()
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    $szData_01 = "Getport 1"
    $szData_02 = "Getport 2"
    $szData_03 = "Getport 3"
    $szData_04 = "Getport 4"
    TCPSend($ConnectedSocket, $szData_01)
    TCPSend($ConnectedSocket, $szData_02)
    TCPSend($ConnectedSocket, $szData_03)
    TCPSend($ConnectedSocket, $szData_04)

  • die meisten Programme erwarten, dass Befehle mit gültigen Zeilenenden gesendet werden was i.d.R. ein Zeilenumbruch wäre (@CRLF)

    das was du dort sendest würde so ankommen:
    "Getport 1Getport 2Getport 3Getport 4" (weil im TCP Buffer werden die nachrichten zusammen gemixt)
    und das ist sicher nicht im Sinne des erfinders^^

    [autoit]

    $szData = "Getport 1" & @CRLF & _
    "Getport 2" & @CRLF & _
    "Getport 3" & @CRLF & _
    "Getport 4" & @CRLF

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

    TCPSend($ConnectedSocket, $szData)

    [/autoit]


    so würde die Anfrage zeilenweiße ankommen und der Server könnte die nachricht phrasen

    und die Antwort vom Server lautet jetzt nur "1" oder "0"?
    er sagt nicht nochmal zu welchem Port die Zahl gehört?
    das wäre äußerst suboptimal (außer er sendet die antwort in der Reihenfolge in der auch angefragt wurde!)
    du müsstest dann erst eine Getport anfrage schicken die antwort abwarten und dann die nächste anfrage... usw.

    mfg Krabat

    Einmal editiert, zuletzt von Krabat (17. Oktober 2013 um 11:39)

  • Hi,

    Zitat

    Ich will quasi alle paar Sekunden alle Ports abfragen

    wenn du so viel Zeit hast, ist das völlig unkritisch!
    Ich würde alle x Sekunden einfach eine Schleife laufen lassen, welche jeden der Ports einzeln abfragt und auf das Ergebnis wartet.
    Pseudocode:

    [autoit]

    Dim $var[5]
    while Sleep(4000) ;alle 4 sekunden
    For $i = 1 to 4 ;4 Ports
    TCPSend($ConnectedSocket, "Getport " & $i) ;Anfrage an Socket
    $var[$i] = "" ;Variable
    do
    $var[$i] = TCPRecv($ConnectedSocket, 100) ;Empfangspuffer auslesen
    if @error then exit(MsgBox(0, 0, "Verbindungsfehler"))
    until $var[$i] <> "" ;so lange, bis etwas gesendet wurde
    ConsoleWrite('$var[' & $i & '] = ' & $var[$i] & @crlf);Variablen ausgeben
    next
    ConsoleWrite(@crlf)
    wend

    [/autoit]