Nabend
Für ein aktuelles Projekt habe ich mir ein Automatisiertes IPC geschrieben welches 6 Protokolle unterstützt (TCP / UDP / Datei / Clipboard / Mailslot / Messagehandler). 5 dieser Protokolle laufen schon seit geraumer Zeit nur bekomme ich das UDP-Protokoll nicht in den Griff... Entweder stehe ich total auf dem Schlauch vielleicht hat meine Rechner-Konfig einen Knall - oder es liegt an der aktuellen AutoIt3 Version.
Ich habe mal zwei einfache Versionen geschrieben damit wenigstens eine davon funktioniert, die TCP-Variante nutzt einen Datenkanal und die UDP zwei.
TCP
#Region - Includes -----------------------------------------------------------------------------------------------------------------
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_UseUPX=n
#RequireAdmin
#include-once
#include <Array.au3>
#include <String.au3>
Opt("MustDeclareVars", 1)
#EndRegion -------------------------------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------------------------------------
; Deklarationen
; ----------------------------------------------------------------------------------------------------------------------------------
Global _
$eTCP_Handle[4], _
$eTCP_IP = "127.0.0.1", _
$eTCP_String = FileRead(@AutoItExe), _
$eTCP_File = @ScriptDir & "\" & StringTrimRight(@ScriptName, 4) & ".exe"
Global _
$i4KiB = 4096, _
$bEOF = "{EOF}", _
$iEOFLen = StringLen($bEOF)
; ----------------------------------------------------------------------------------------------------------------------------------
; TCP Transfer
; ----------------------------------------------------------------------------------------------------------------------------------
Func _GetTCP($hSocket)
Local _
$sTransfer
Do
$sTransfer &= TCPRecv($hSocket, $i4KiB)
Until StringRight($sTransfer, $iEOFLen) = $bEOF
$sTransfer = StringTrimRight($sTransfer, $iEOFLen)
Return $sTransfer
EndFunc
Func _SetTCP($vData, $hSocket)
TCPSend($hSocket, $vData & $bEOF)
EndFunc
; ----------------------------------------------------------------------------------------------------------------------------------
; Prozedur-Start
; ----------------------------------------------------------------------------------------------------------------------------------
If @Compiled = 0 Then ; Host
Local _
$hHandle, _
$sAutoItExe, _
$hTimer, _
$sText
; Client Kompilieren
$sAutoItExe = StringReplace(@AutoItExe, "AutoIt3.exe", "aut2exe\aut2exe.exe")
RunWait($sAutoItExe & ' /in ' & '"' & StringReplace($eTCP_File, ".exe", ".au3") & '"')
; Client Starten
TCPStartup()
$eTCP_Handle[0] = 2015
$eTCP_Handle[1] = TCPListen($eTCP_IP, $eTCP_Handle[0]) ; Host <--> Client
$hHandle = ShellExecute($eTCP_File, "", @SW_HIDE)
; Warten auf Client-Verbindung
Do
$eTCP_Handle[2] = TCPAccept($eTCP_Handle[1])
Until $eTCP_Handle[2] <> -1
; Daten an Client senden
$hTimer = TimerInit()
_SetTCP($eTCP_String, $eTCP_Handle[2])
$sText = _GetTCP($eTCP_Handle[2])
$hTimer = TimerDiff($hTimer)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hTimer = ' & $hTimer & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$sText = "Data Valid: " & ($eTCP_String = $sText ? "Yes" : "No")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sText = ' & $sText & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
TCPCloseSocket($eTCP_Handle[2])
TCPCloseSocket($eTCP_Handle[1])
TCPShutdown()
EndIf
If @Compiled Then ; Client
Local _
$sText
; Client Starten und mit Host verbinden
TCPStartup()
AdlibRegister("Check", 100)
$eTCP_Handle[0] = 2015
Do
$eTCP_Handle[1] = TCPConnect($eTCP_IP, $eTCP_Handle[0]) ; Host <--> Client
Until $eTCP_Handle[1] > -1
; Daten von Host empfangen und zurücksenden
$sText = _GetTCP($eTCP_Handle[1])
_SetTCP($sText, $eTCP_Handle[1])
TCPCloseSocket($eTCP_Handle[1])
TCPShutdown()
EndIf
Func Check()
if ProcessExists("autoit3.exe") = 0 then Exit
EndFunc
Alles anzeigen
UDP
#Region - Includes -----------------------------------------------------------------------------------------------------------------
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_UseUPX=n
#RequireAdmin
#include-once
#include <Array.au3>
#include <String.au3>
Opt("MustDeclareVars", 1)
#EndRegion -------------------------------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------------------------------------
; Deklarationen
; ----------------------------------------------------------------------------------------------------------------------------------
Global _
$eUDP_Handle[4], _
$eUDP_IP = "127.0.0.1", _
$eUDP_String = FileRead(@AutoItExe), _
$eUDP_File = @ScriptDir & "\" & StringTrimRight(@ScriptName, 4) & ".exe"
Global _
$i4KiB = 4096, _
$bEOF = "{EOF}", _
$iEOFLen = StringLen($bEOF)
; ----------------------------------------------------------------------------------------------------------------------------------
; UDP Transfer
; ----------------------------------------------------------------------------------------------------------------------------------
Func _GetUdp($hSocket)
Local _
$sTransfer
Do
$sTransfer &= UDPRecv($hSocket, $i4KiB, 0)
Until StringRight($sTransfer, $iEOFLen) = $bEOF
$sTransfer = StringTrimRight($sTransfer, $iEOFLen)
Return $sTransfer
EndFunc
Func _SetUdp($vData, $hSocket)
UDPSend($hSocket, $vData & $bEOF)
EndFunc
Func _GetUdp_Binary($hSocket)
Local _
$sTransfer
Do
$sTransfer &= UDPRecv($hSocket, $i4KiB, 1)
Until StringRight($sTransfer, $iEOFLen*2) = StringTrimLeft(StringToBinary($bEOF), 2)
$sTransfer = BinaryToString($sTransfer)
$sTransfer = StringTrimRight($sTransfer, $iEOFLen)
Return $sTransfer
EndFunc
Func _SetUdp_Binary($vData, $hSocket)
UDPSend($hSocket, StringToBinary($vData & $bEOF))
EndFunc
; ----------------------------------------------------------------------------------------------------------------------------------
; Prozedur-Start
; ----------------------------------------------------------------------------------------------------------------------------------
If @Compiled = 0 Then ; Host
Local _
$hHandle, _
$sAutoItExe, _
$hTimer, _
$sText
; Client Kompilieren
$sAutoItExe = StringReplace(@AutoItExe, "AutoIt3.exe", "aut2exe\aut2exe.exe")
RunWait($sAutoItExe & ' /in ' & '"' & StringReplace($eUDP_File, ".exe", ".au3") & '"')
; Client Starten
UDPStartup()
$eUDP_Handle[0] = 2015
$eUDP_Handle[1] = UDPBind($eUDP_IP, $eUDP_Handle[0]) ; Host <-- Client
$eUDP_Handle[2] = $eUDP_Handle[0]+1
$hHandle = ShellExecute($eUDP_File, "", @SW_HIDE)
; Warten auf Client-Verbindung
Do
$eUDP_Handle[3] = UDPOpen($eUDP_IP, $eUDP_Handle[2]) ; Host --> Client
Until @error = 0
; Daten an Client senden
$hTimer = TimerInit()
_SetUdp($eUDP_String, $eUDP_Handle[3])
$sText = _GetUdp($eUDP_Handle[1])
$hTimer = TimerDiff($hTimer)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hTimer = ' & $hTimer & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$sText = "Data Valid: " & ($eUDP_String = $sText ? "Yes" : "No")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sText = ' & $sText & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
UDPCloseSocket($eUDP_Handle[1])
UDPCloseSocket($eUDP_Handle[3])
UDPShutdown()
EndIf
If @Compiled Then ; Client
Local _
$sText
; Client Starten und mit Host verbinden
UDPStartup()
AdlibRegister("Check", 100)
$eUDP_Handle[0] = 2015
Do
$eUDP_Handle[1] = UDPOpen($eUDP_IP, $eUDP_Handle[0]) ; Host <-- Client
Until @error = 0
$eUDP_Handle[2] = $eUDP_Handle[0]+1
$eUDP_Handle[3] = UDPBind($eUDP_IP, $eUDP_Handle[2]) ; Host --> Client
; Daten von Host empfangen und zurücksenden
$sText = _GetUdp($eUDP_Handle[3])
MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '@error' & @CRLF & @CRLF & 'Return:' & @CRLF & @error) ;### Debug MSGBOX
MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '$sText' & @CRLF & @CRLF & 'Return:' & @CRLF & $sText) ;### Debug MSGBOX
_SetUdp($sText, $eUDP_Handle[1])
UDPCloseSocket($eUDP_Handle[1])
UDPCloseSocket($eUDP_Handle[3])
UDPShutdown()
EndIf
Func Check()
if ProcessExists("autoit3.exe") = 0 then Exit
EndFunc
Alles anzeigen
Die Clients erstellen sich bei Ausführungder Scripte selber.
Wo liegt das Problem bei der UDF-Version?? Host und Client verbinden sich (@error=0) aber entwender sende ich oder empfange die Daten falsch...
System Win7 x64, AutoIt V3.3.14.2
Grüsse!
[PS]
Wieso gehen die Code-Tags nicht richtig?!? <- Sorry