Server - Client tcp

  • ok dann nochmal :D

    server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <String.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    DirCreate("C:\Message\")

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

    Global $open

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

    Example()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $ip, $host, $time
    Local $msg, $recv

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

    ; Startet den TCP Service
    ;==============================================
    TCPStartup()

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

    ; Erstellt einen lauschenden Port.
    ; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
    If $MainSocket = -1 Then Exit

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

    ; Erstellt eine GUI für Messages.
    ;==============================================
    $GOOEY = GUICreate("Message - Server IP: " & $szIPADDRESS, 550, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 180)
    GUISetState()

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

    ; Initialisiert eine Variable um eine Verbindung anzugeben
    ;==============================================
    $ConnectedSocket = -1

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

    ; Wartet auf und akzeptiert eine Verbindung
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Bekommt die IP des verbundenen Clients
    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    ; GUI Message Schleife
    ;==============================================
    While 1
    $msg = GUIGetMsg()

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

    ; GUI beendet
    ;--------------------
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

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

    ; Versucht Daten zu empfangen, bis zu 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 30000)

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

    ; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    $ip = _StringBetween($recv, "IP Adresse: ", " Computername:")
    $host = _StringBetween($recv, "Computername: ", " Zeit des Clienten:")
    $time = StringRight($recv, 8)
    IniWrite(@ScriptDir & "\recieved.ini", $ip[0], $host[0], $time)
    EndIf
    WEnd

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

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

    TCPShutdown()
    EndFunc ;==>Example

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

    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", 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 ;==>SocketToIP

    [/autoit]

    client:

    Spoiler anzeigen
    [autoit]

    TCPStartup(); wird nur einmal aufgerufen

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

    Global $szIPADDRESS = "192.168.245.128"
    Global $nPORT = 33891
    Global $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    AdlibRegister('_client', 5000); rufe die func _client alle 5 sec auf

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

    While 1
    Sleep(100)
    WEnd

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

    Func _client ()
    $szData = "IP Adresse: " & @IPAddress1 & " Computername: " & @ComputerName & " Zeit des Clienten: " & @HOUR & ":" & @MIN & ":" & @SEC
    TCPSend($ConnectedSocket, $szData)
    EndFunc ;==>_client

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

    Func _quit()
    TCPShutdown()
    EndFunc ;==>_quit

    [/autoit]
  • funzt wunderbar ;)

    rep + :D

    hab mir das jetz angepasst, problem ist, wenn der server bei mir liegt, und ich 2 weitere rechner in der domain hab, kann nur einer senden, mehrfach senden ist nicht.
    also von mehreren clienten.

    kann man das iwie ändern? das muss gehn ;(

  • Dazu gibt's genug beispiele, wie man das anstellt.
    du musst TCPAccept einfach immer wieder anwenden.
    such mal nach TCP chat oder mehrere verbindungen oder irgendsowas.
    oder im englischen forum nach sowas wie: TCP Event driven

  • Also ich hab mir das mal angeschaut.
    GTA Spider hat mir auch nochmal was geschickt:

    https://autoit.de/index.php?page=Thread&amp;threadID=18653

    Leider komm ich damit auch nicht weit.

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <String.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    DirCreate("C:\Message\")

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

    Global $open
    Global Const $MAXCON = 50;

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

    Global $aClients[$MAXCON + 1][3]
    $aClients[0][0] = $MAXCON

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

    Example()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $ip, $host, $time
    Local $msg, $recv

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

    ; Startet den TCP Service
    ;==============================================
    TCPStartup()

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

    ; Erstellt einen lauschenden Port.
    ; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT, $MAXCON)

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

    ; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
    If $MainSocket = -1 Then Exit

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

    ; Erstellt eine GUI für Messages.
    ;==============================================
    $GOOEY = GUICreate("Message - Server IP: " & $szIPADDRESS, 550, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 180)
    GUISetState()

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

    ; Initialisiert eine Variable um eine Verbindung anzugeben
    ;==============================================
    $ConnectedSocket = -1

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

    ; Wartet auf und akzeptiert eine Verbindung
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Bekommt die IP des verbundenen Clients
    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    ; GUI Message Schleife
    ;==============================================
    While 1
    $msg = GUIGetMsg()

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

    ; GUI beendet
    ;--------------------
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

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

    ; Versucht Daten zu empfangen, bis zu 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 30000)

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

    ; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    $ip = _StringBetween($recv, "IP Adresse: ", " Computername:")
    $host = _StringBetween($recv, "Computername: ", " Zeit des Clienten:")
    $time = StringRight($recv, 8)
    IniWrite(@ScriptDir & "\recieved.ini", $ip[0], $host[0], $time)
    EndIf
    WEnd

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

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

    TCPShutdown()
    EndFunc ;==>Example

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

    Func TCPAcc()
    $hAcc = TCPAccept($MainSocket)
    If $hAcc > 0 Then _AddClient($hAcc)
    EndFunc ;==>TCPAcc
    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", 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 ;==>SocketToIP

    [/autoit]


    Client:


    Spoiler anzeigen
    [autoit]

    TCPStartup(); wird nur einmal aufgerufen

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

    Global $szIPADDRESS = "10.110.100.135"
    Global $nPORT = 33891
    Global $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    AdlibRegister('_client', 5000); rufe die func _client alle 5 sec auf

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

    While 1
    Sleep(100)
    WEnd

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

    Func _client ()
    $szData = "IP Adresse: " & @IPAddress1 & " Computername: " & @ComputerName & " Zeit des Clienten: " & @HOUR & ":" & @MIN & ":" & @SEC
    TCPSend($ConnectedSocket, $szData)
    EndFunc ;==>_client

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

    Func _quit()
    TCPShutdown()
    EndFunc ;==>_quit

    [/autoit]

    Ich kann wie gesagt, immer nur einen Clienten benutzen der zum Server sendet.
    Nicht mehrere.

    Gruß

    Kev

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <String.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    DirCreate("C:\Message\")

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

    Global $open
    Global Const $MAXCON = 50;

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

    Global $aClients[$MAXCON + 1][3]
    $aClients[0][0] = $MAXCON

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

    Example()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $ip, $host, $time
    Local $msg, $recv

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

    ; Startet den TCP Service
    ;==============================================
    TCPStartup()

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

    ; Erstellt einen lauschenden Port.
    ; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT, $MAXCON)

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

    ; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
    If $MainSocket = -1 Then Exit

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

    ; Erstellt eine GUI für Messages.
    ;==============================================
    $GOOEY = GUICreate("Message - Server IP: " & $szIPADDRESS, 550, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 180)
    GUISetState()

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

    ; Initialisiert eine Variable um eine Verbindung anzugeben
    ;==============================================
    $ConnectedSocket = -1

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

    ; Wartet auf und akzeptiert eine Verbindung
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1
    If $ConnectedSocket <> -1 Then _ArrayAdd($aUsers,$Temp)

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

    ; Bekommt die IP des verbundenen Clients
    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    ; GUI Message Schleife
    ;==============================================
    While 1
    $msg = GUIGetMsg()

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

    ; GUI beendet
    ;--------------------
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

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

    ; Versucht Daten zu empfangen, bis zu 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 30000)

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

    ; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    $ip = _StringBetween($recv, "IP Adresse: ", " Computername:")
    $host = _StringBetween($recv, "Computername: ", " Zeit des Clienten:")
    $time = StringRight($recv, 8)
    IniWrite(@ScriptDir & "\recieved.ini", $ip[0], $host[0], $time)
    EndIf
    WEnd

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

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

    TCPShutdown()
    EndFunc ;==>Example

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

    Func TCPAcc()
    $hAcc = TCPAccept($MainSocket)
    If $hAcc > 0 Then _AddClient($hAcc)
    EndFunc ;==>TCPAcc
    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", 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 ;==>SocketToIP

    [/autoit]


    ? ;(

  • Als ich mich mit dem Thema befasste fand ich ne UDF, die sich um das TCPIP-Brimborium kümmert ... und kann mehrere Clients haben.
    TCP UDF, Event driven! Version 3
    Die Bespiele für Client/Server fand ich etwas mau, aber man kann nicht alles haben =)
    Grüße