Tcp Server will nicht, kein Recv

  • Also ich schreibe gerade ein Paar Funktionen damit ich leichter ein TCP-Server machen kann, den ich für mein nächstes Vorhaben brauche.
    Aber leider bekomm ich kein Recv.

    Spoiler anzeigen
    [autoit]

    $array = TCP_StartServer ( 8080 )

    ;MsgBox ( 0 , "", $array & "|" & @error & "|" & @extended )
    ;_ArrayDisplay ($array)

    TCP_RegisterEvent (0, "c", $array )
    TCP_RegisterEvent (1, "r", $array )
    TCP_RegisterEvent (2, "d", $array )

    TCP_MainActionLoop ( $array )

    ;MsgBox ( 0 , "", $return & "|" & @error & "|" & @extended )
    ;_ArrayDisplay ( $return )

    ; ==== TEST =====

    Func c ( $socket )

    MsgBox ( 0 , "Connect", "Socket " & $socket & " connected")

    EndFunc

    Func r ($data, $socket )

    MsgBox ( 0 , "Reciev", "Recieved Data '" & $data & "' from Socket " & $socket )

    EndFunc

    Func d ( $socket )

    MsgBox ( 0 , "DisConnect", "Socket " & $socket & " disconnected")

    EndFunc


    ; ==== Main ====

    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[6]
    $aServerArray[0] = "ServerArray: "&@ScriptName
    $aServerArray[1] = $hMainSocket
    $aServerArray[2] = False
    $aServerArray[3] = False
    $aServerArray[4] = False

    Dim $aClientArray[1]
    $aServerArray[5] = $aClientArray

    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_MainActionLoop ( ByRef $aServerArray )

    if not IsArray ($aServerArray) or $aServerArray[0] <> "ServerArray: "&@ScriptName Then
    Return SetError (1,0,0)
    EndIf

    Local $hConnectSocket, $iUbound, $aTempArray

    While 1

    $hConnectSocket = TCPAccept ( $aServerArray[1] )
    $aTempArray = $aServerArray[5]

    if $hConnectSocket <> -1 then

    ;client connect

    if $aServerArray[2] <> '' Then

    Call ( $aServerArray[2], $hConnectSocket )

    EndIf

    $iUbound = UBound ( $aTempArray )

    ReDim $aTempArray[$iUbound+1]

    $aTempArray[$iUbound-1] = $hConnectSocket


    EndIf

    For $i = 0 to UBound ( $aTempArray ) -1

    If $aTempArray[$i] <> "" Then

    MsgBox ( 0 , "", $aTempArray[$i] )

    $sRecv = TCPRecv ( $aTempArray[$i], 20000000)


    If @error Then

    ;client disconnected

    $aTempArray[$i] = ''

    if $aServerArray[4] <> '' Then

    Call ( $aServerArray[4], $hConnectSocket )

    EndIf


    EndIf

    if $sRecv <> '' Then

    if $aServerArray[3] <> '' Then

    ;client send

    Call ( $aServerArray[3], $sRecv ,$aTempArray[$i])

    EndIf

    EndIf

    EndIf

    Next

    Sleep ( 25 )

    WEnd

    EndFunc

    [/autoit]
  • Ok ich habe die Ersten Kinderkrankheiten beseitigt:

    Spoiler anzeigen
    [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

    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

    __TCP_TrackClient ( $hConnectSocket , $aServerArray )

    EndIf


    WEnd


    EndFunc

    func __TCP_TrackClient ( $hConnectSocket, ByRef $aServerArray )

    Local $sRecv


    while 1


    $sRecv = TCPRecv ( $hConnectSocket , 2048 )

    ;ConsoleWrite ( 'Recv: ' & $sRecv & @lf)


    if @error Then

    if $aServerArray[4] <> '' and $aServerArray[4] <> false Then

    Call ( $aServerArray[4], $hConnectSocket )

    EndIf

    Return

    EndIf


    if $sRecv <> '' Then


    if $aServerArray[3] <> '' and $aServerArray[3] <> false Then

    Call ($aServerArray[3], $sRecv , $hConnectSocket )

    EndIf

    EndIf


    WEnd

    EndFunc

    [/autoit]

    Und hier ein Beispiel wie man es nutzen kann:

    Spoiler anzeigen
    [autoit]

    $array = TCP_StartServer ( 8080 )

    ;MsgBox ( 0 , "", $array & "|" & @error & "|" & @extended )
    ;_ArrayDisplay ($array)

    TCP_RegisterEvent (0, "c", $array )
    TCP_RegisterEvent (1, "r", $array )
    TCP_RegisterEvent (2, "d", $array )

    ;_ArrayDisplay ( $array )

    TCP_MainActionLoopInit ( $array )

    ;MsgBox ( 0 , "", $return & "|" & @error & "|" & @extended )
    ;_ArrayDisplay ( $return )

    ; ==== TEST =====

    Func c ( $socket )

    ;MsgBox ( 0 , "Connect", "Socket " & $socket & " connected")

    ConsoleWrite ( "Socket " & $socket & " with ip " & TCP_SocketToIp ($socket) &@error&" connected" & @lf )

    EndFunc

    Func r ($data, $socket )

    ConsoleWrite ("Recieved Data '" & $data & "' from Socket " & $socket & @lf )

    EndFunc

    Func d ( $socket )

    ConsoleWrite ( "Socket " & $socket & " disconnected" & @lf )

    EndFunc

    [/autoit]
  • Bei Mehr als einem Client hat meine Alter Version nicht funktioniert....

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