Da ich im Englischen Forum den Script für 'Event Driven TCP' gefunden hab, mir aber die benutzung von Globalen Variablen nicht gefällt, hab ich meine Eigne Methode Entwickelt.
Ich werde sie bald noch um ein Error Handler Erweitern.
Leider Funktioniert scheinbar die Funktion SocketToIP, die ich aus der AutoIt Hilfe kopiert habe nicht.
Spoiler anzeigen
Global Const $Client_Connect = 0
Global Const $Client_Receive = 1
Global Const $Client_Disconnect = 2
Func TCP_StartServer ( $iPort, $sIP = "0.0.0.0" )
If not IsInt ( $iPort ) or not IsString ( $sIP ) then
Return SetError (1,0,0)
EndIf
TCPStartup ()
Local $hMainSocket, $aServerArray, $aClientArray
$hMainSocket = TCPListen ( $sIp, $iPort )
if @error Then
Return SetError (2,@error,0)
EndIf
Dim $aServerArray[5]
$aServerArray[0] = "ServerArray: "&@ScriptName
$aServerArray[1] = $hMainSocket
$aServerArray[2] = False
$aServerArray[3] = False
$aServerArray[4] = False
Return $aServerArray
EndFunc
Func TCP_RegisterEvent ( $iEventID, $sFunction, ByRef $aServerArray )
if not IsInt ($iEventID) or not IsString ( $sFunction ) Then
Return SetError (1,0,0)
Else
if not IsArray ($aServerArray) or $aServerArray[0] <> "ServerArray: "&@ScriptName Then
Return SetError (2,0,0)
EndIf
EndIf
Switch $iEventID
Case 0
;client connect
$aServerArray[2] = $sFunction
Case 1
;client recv
$aServerArray[3] = $sFunction
Case 2
;client disconnect
$aServerArray[4] = $sFunction
Case Else
Return SetError (3,0,0)
EndSwitch
Return $aServerArray
EndFunc
Func TCP_SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
[/autoit] [autoit][/autoit] [autoit]Return $aRet
EndFunc
Func TCP_MainActionLoopInit ( ByRef $aServerArray )
if not IsArray ($aServerArray) or $aServerArray[0] <> "ServerArray: "&@ScriptName Then
Return SetError (1,0,0)
EndIf
Local $hConnectSocket, $aClients, $iFreeIndex
Dim $aClients[1]
$iFreeIndex = 0
While 1
sleep ( 1 )
$hConnectSocket = TCPAccept ( $aServerArray[1] )
if $hConnectSocket > -1 Then
if $aServerArray[2] <> '' and $aServerArray[2] <> false Then
Call ( $aServerArray[2], $hConnectSocket )
EndIf
if $iFreeIndex > -1 Then
$aClients[$iFreeIndex] = $hConnectSocket
Else
ReDim $aClients[UBound ($aClients)+2]
$aClients[UBound ($aClients)-2] = $hConnectSocket
$iFreeIndex = UBound ($aClients)-1
EndIf
EndIf
;_ArrayDisplay ( $aClients )
for $i=0 to UBound ($aClients)-1
if $aClients[$i] <> '' Then
$sRecv = TCPRecv ( $aClients[$i] , 2048 )
if @error Then
$aClients[$i] = ''
$iFreeIndex = $i
if $aServerArray[4] <> '' and $aServerArray[4] <> false Then
Call ( $aServerArray[4] , $aClients[$i] )
EndIf
ContinueLoop
EndIf
if $sRecv <> '' Then
if $aServerArray[3] <> '' and $aServerArray[3] <> false Then
Call ($aServerArray[3], $sRecv , $aClients[$i] )
EndIf
EndIf
EndIf
Next
WEnd
EndFunc