﻿#include <GUIConstantsEx.au3>
Global $sTitle = 'Interprozesskommunikation' ; Programmname (für _Singleton)
Global $sIPAddress = @IPAddress1 ; Server-IP-Adresse (muss die lokale IP-Adresse sein, NAT macht der Router)
Global $iPort = 55555 ; beliebige Portnummer (sollte im Bereich zwischen 49152 und 65535 liegen)
Global $hGui, $idInput, $idCheckbox, $MainSocket, $ConnectedSocket = -1, $sData, $sRecv, $iPID

TCPStartup()
$hGui = GUICreate($sTitle & ' - Server', 360, 480)
$idCheckbox = GUICtrlCreateCheckbox('Checkbox', 10, 10, 340, 20)
$idInput = GUICtrlCreateEdit('', 10, 40, 340, 430)
GUISetState(@SW_SHOW, $hGui)
$MainSocket = TCPListen($sIPAddress, $iPort)
If $MainSocket = -1 Then Exit MsgBox(0, $sTitle, 'Server konnte nicht gestartet werden!')
GUICtrlSetData($idInput, '> Server gestartet!' & @CRLF, 1)
While True ; in dieser Schleife wartet der Server auf Daten und es wird GUIGetMsg abgefragt
	If $ConnectedSocket < 1 Then ; wenn noch keine Verbindung hergestellt wurde, dann..
		$ConnectedSocket = TCPAccept($MainSocket) ; abfragen, ob sich der Client verbunden hat
		If $ConnectedSocket <> -1 Then ; wenn Verbindung hergestellt, dann Meldung ausgeben
			GUICtrlSetData($idInput, '> Verbindung hergestellt.' & @CRLF, 1)
			GUICtrlSetData($idInput, '> Warte auf Daten...' & @CRLF, 1)
		EndIf
	Else ; Verbindung ist hergestellt
		TCPSend($ConnectedSocket, '.') ; irgend ein Zeichen an den Client senden, zum testen, ob er noch online ist
		If @error Then ; wenn dabei ein Fehler aufgetreten ist, dann ist die Verbindung unterbrochen (Client beendet)
			TCPCloseSocket($ConnectedSocket)
			$ConnectedSocket = -1
			GUICtrlSetData($idInput, '> Verbindung unterbrochen.' & @CRLF, 1)
			GUICtrlSetData($idInput, '> Warte auf Verbindung...' & @CRLF, 1)
		EndIf
		$sRecv = TCPRecv($ConnectedSocket, 2048, 1) ; Daten abholen
		If @error Then
			TCPCloseSocket($ConnectedSocket)
			$ConnectedSocket = -1
			GUICtrlSetData($idInput, '> Verbindung unterbrochen.' & @CRLF, 1)
			GUICtrlSetData($idInput, '> Warte auf Verbindung...' & @CRLF, 1)
		Else ; Daten wurden korrekt empfangen
			$sRecv = BinaryToString($sRecv, 4) ; Daten umwandeln
			If $sRecv <> '' Then
				GUICtrlSetData($idInput, $sRecv & @CRLF, 1) ; und im Editfeld ausgeben
				If StringLeft($sRecv, 2) = 'cb' Then ; wenn Kommando "cb" empfangen, dann die folgende Zahl (1 oder 0) auswerten
					GUICtrlSetState($idCheckbox, StringMid($sRecv, 3, 1) = '1' ? $GUI_CHECKED : $GUI_UNCHECKED)
				EndIf
			EndIf
		EndIf
	EndIf
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $idCheckbox
			If $ConnectedSocket > 0 Then
				$sData = BitAND(GUICtrlRead($idCheckbox), $GUI_CHECKED) ? 'cb1' : 'cb0'
				TCPSend($ConnectedSocket, StringToBinary($sData, 4)) ; Daten an den Client senden
			EndIf
	EndSwitch
WEnd
TCPCloseSocket($ConnectedSocket)
GUICtrlSetData($idInput, '> Verbindung getrennt.' & @CRLF, 1)
GUICtrlSetData($idInput, '> Server wird beendet.' & @CRLF, 1)
TCPCloseSocket($MainSocket)
TCPShutdown()
