Hallo zusammen,
ich versuche mich gerade an einem Terminal-Programm. Es soll mittels "TCPRecv" alphanumerische Daten empfangen. Aus der AutoIT Hilfe habe ich mir etwas zurecht gebastelt was bis auf eine Kleinigkeit gut funktioniert.
Ich kann die IP-Adresse und den Port frei wählen und dann lauschen. Wenn mein Controller Daten sendet wird dies in einem Textfeld korrekt angegeben. Das starten des Clients funktioniert richtig weil es in der Hauptschleife sitzt. Das stoppen kann aber dort nicht funktionieren da ja der "TCPRecv" im Loop läuft. Nun hab ich mir gedacht das der Loop der "TCPRecv" mittels eines Stop Button angehalten werden soll. Und das funktioniert leider nicht. In Zeile 111 unterbricht eine Variable den Loop. Wenn ich auf "Client Stopp" klicke kommen keine Daten mehr aber das Programm lässt sich über das rote X oben rechts nicht beenden oder durch "Client Start" wieder empfangsbereit machen.
Vielleicht kann mir jemand auf die Sprünge helfen.
Hier der Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Netzwerk Test Terminal", 1357, 864, 300, 120) ;Programmfenster
$Edit1 = GUICtrlCreateEdit("", 104, 88, 873, 529) ;Ergebnistestfeld
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") ;Schriftart
$IP_Adress = GUICtrlCreateLabel("IP Adresse", 104, 50, 92, 20) ;Label IP Adresse
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") ;Schriftart
$TextBox_IP_Adress = GUICtrlCreateEdit("", 200, 50, 209, 20, $ES_WANTRETURN) ;Eingabefeld IP Adresse
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") ;Schriftart
$Port = GUICtrlCreateLabel("Port", 427, 50, 40, 20) ;Label Port
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") ;Schriftart
$TextBox_Port = GUICtrlCreateEdit("", 475, 50, 113, 20, $ES_WANTRETURN) ;Eingabefeld Port
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") ;Schriftart
$Button_Start_Client = GUICtrlCreateButton("Client Start", 616, 40, 121, 33) ;Button Start Client
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") ;Schriftart
$Button_Stop_Client = GUICtrlCreateButton("Client Stopp", 752, 38, 121, 33) ;Button Stopp Client
GUICtrlSetOnEvent(-1, "ClientStop")
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") ;Schriftart
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;----------------------------------------------------Globale Variablen --------------------------------------------------------------------------
Global $bClientStop = 0
;--------------------------------------------------- Programmschleife ---------------------------------------------------------------------------
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $Button_Start_Client
TextboxWrite(GUICtrlRead($TextBox_IP_Adress),$Edit1)
TextboxWrite(GUICtrlRead($TextBox_Port),$Edit1)
Example()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
;--------------------------------------------------- Example ----------------------------------------------------------------------------
Func Example()
Opt("GUIOnEventMode", 1)
TCPStartup() ; Start the TCP service.
; Register OnAutoItExit to be called when the script is closed.
OnAutoItExitRegister("OnAutoItExit")
;Adresseingabe des Servers
Local $sIPAddress = GUICtrlRead($TextBox_IP_Adress) ;Server IP-Adresseingabe von Textfeld
Local $iPort = GUICtrlRead($TextBox_Port) ;Porteingabe von Textfeld
; Assign a Local variable the socket and connect to a listening socket with the IP Address and Port specified.
Local $iSocket = TCPConnect($sIPAddress, $iPort)
Local $iError = 0
; If an error occurred display the error code and return False.
If @error Then
; The server is probably offline/port is not opened on the server.
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Could not connect, Error code: " & $iError)
Return False
EndIf
; Assign Locales Constant variables the number representing 4 KiB; the binary code for the end of the file and the length of the binary code.
Local Const $i4KiB = 4096
Local Const $bEOF = Binary(@CRLF & "{EOF}")
Local Const $iEOFLen = BinaryLen($bEOF)
; Assign a Local variable the empty binary data which will contain the binary data of the file.
Local $bData = Binary("")
; Assign a Local variable to store the length of the data received.
Local $iDataLen = 0
Do
$bData = TCPRecv($iSocket, $i4KiB, $TCP_DATA_BINARY)
; If an error occurred display the error code and return False.
If @error Then
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Connection lost, Error code: " & $iError)
Return False
EndIf
$iDataLen = BinaryLen($bData)
; If nothing is received, retry for the incoming data.
If $iDataLen = 0 Then ContinueLoop
TextboxWrite(BinaryToString($bData), $Edit1)
Until $bClientStop
$bClientStop = 0
; Close the socket.
TCPCloseSocket($iSocket)
EndFunc ;==>Example
Func OnAutoItExit()
TCPShutdown() ; Close the TCP service.
EndFunc ;==>OnAutoItExit
;---------------------------------- Schreibfunktion in Textfeld ---------------------------------------------------------------------
; Write a line to the memo control
Func TextboxWrite($sMessage, $idTextfeld)
GUICtrlSetData($idTextfeld, $sMessage & @CRLF, 1) ;Funktion zum Anzeigen der in $sMessage übergebenen Nachricht an in $idTextfeld angegebenes Textfeld
EndFunc
Func ClientStop()
$bClientStop = 1
EndFunc
Alles anzeigen
Vielen Dank fürs durchlesen
Grüße Jochen