Event Basierendes Server UDF

  • 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
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]


    Global Const $Client_Connect = 0
    Global Const $Client_Receive = 1
    Global Const $Client_Disconnect = 2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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]")

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke :)
    Du hast mich aus meiner Trauer gehollt x)
    Weiss vielleicht jemand wie ich SocketToIp zum laufen bekomme?