#include <GUIConstantsEx.au3>
#include <Misc.au3>

Global $sTitle = 'Interprozesskommunikation' ; Programmname (für _Singleton)
Global $sIPAddress = '127.0.0.1' ; Localhost-IP-Adresse
Global $iPort = 55555 ; beliebige Portnummer (sollte im Bereich zwischen 49152 und 65535 liegen)
Global $hGui, $ID_Input, $MainSocket, $ConnectedSocket = -1, $sData, $sRecv, $iPID

TCPStartup()
If _Singleton($sTitle, 1) = 0 Then ; wenn Server bereits gestartet, dann hier als Client weitermachen
    $ConnectedSocket = TCPConnect($sIPAddress, $iPort) ; Verbindung zum Server herstellen
    If @error Then ; wenn nicht erfolgreich, dann Client beenden mit Fehlermeldung
        MsgBox(16, 'FEHLER!', 'TCPConnect fehlgeschlagen! Fehlernr.: ' & @error)
    Else ; TCP-Verbindung war erfolgreich
        Do ; Schleife mit InputBox solange aufrufen, bis der Benutzer auf 'Abbrechen' klickt oder ein Fehler beim senden auftritt
            $sData = InputBox($sTitle & ' - Client', 'Daten eingeben die an den Server gesendet werden sollen:', '', '', 420, 140)
            If @error Then ExitLoop ; Benutzer hat auf 'Abbrechen' geklickt, also Schleife verlassen
			$sData = StringToBinary($sData, 4) ; Daten umwandeln
            TCPSend($ConnectedSocket, $sData) ; Daten an den Server senden
        Until @error ; mit der Schleife fortfahren, wenn beim senden kein Fehler aufgetreten ist
		TCPCloseSocket($ConnectedSocket) ; Verbindung zum Server trennen
    EndIf
Else ; Server läuft noch nicht, also Server starten
	$hGui = GUICreate($sTitle & ' - Server', 360, 480)
	$ID_Input = GUICtrlCreateEdit('', 10, 10, 340, 460)
	GUISetState(@SW_SHOW, $hGui)
	$MainSocket = TCPListen($sIPAddress, $iPort)
	If $MainSocket = -1 Then Exit MsgBox(0, $sTitle, 'Server konnte nicht gestartet werden!')
	GUICtrlSetData($ID_Input, '> Server gestartet!' & @CRLF, 1)
	GUICtrlSetData($ID_Input, '> Starte Client...' & @CRLF, 1)
	Run(@AutoItExe & ' "' & @ScriptFullPath & '"') ; starte das Script nochmal (als Client)
	If @error Then Exit MsgBox(0, $sTitle, 'Client konnte nicht gestartet werden.')
	GUICtrlSetData($ID_Input, '> Client gestartet.' & @CRLF, 1)
	Do ; 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($ID_Input, '> Verbindung hergestellt.' & @CRLF, 1)
				GUICtrlSetData($ID_Input, '> Warte auf Daten...' & @CRLF, 1)
			EndIf
		Else ; Verbindung ist hergestellt
			$sRecv = TCPRecv($ConnectedSocket, 2048) ; Daten abholen
			If @error Then ; wenn dabei ein Fehler aufgetreten ist, dann ist die Verbindung unterbrochen (Client beendet)
				$ConnectedSocket = -1
				GUICtrlSetData($ID_Input, '> Verbindung unterbrochen.' & @CRLF, 1)
				GUICtrlSetData($ID_Input, '> Warte auf Verbindung...' & @CRLF, 1)
			Else ; Daten wurden korrekt empfangen
				$sRecv = BinaryToString($sRecv, 4) ; Daten umwandeln
				If $sRecv <> '' Then GUICtrlSetData($ID_Input, $sRecv & @CRLF, 1) ; und im Editfeld ausgeben
			EndIf
		EndIf
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUICtrlSetData($ID_Input, '> Verbindung getrennt.' & @CRLF, 1)
	GUICtrlSetData($ID_Input, '> Server wird beendet.' & @CRLF, 1)
	TCPCloseSocket($ConnectedSocket)
	Sleep(1000)
EndIf
TCPShutdown()
Exit
