Server - Client tcp

  • kaaaay habs, thx schnitzel.

    next thing :D

    das was der server recv. solla in ne text datei spiechern.
    macht er auch, bloß soller nach jedem ding was er kriegt,in ne neue zeile gehen, sprich enter drücken und da dann weiter machen.

    das wenn ich den clienten hier jetz.
    auf 100 rechnern hab.

    den ersten reinschreibt mit: ahh auch gute iddee. genau :D

    PC1: IP/Computername/Time
    PC2:IP/Computername/Time
    unsoweiter...

    immer in ner neuen zeile.

    server quellcode ist:;

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    dircreate("C:\Message\")
    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
    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))
    Filewrite("C:/Message/recieved.txt",$recv)
    WEnd

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

    wichtige wäre hierbei denne:

    [autoit]

    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    Filewrite("C:/Message/recieved.txt",$recv)

    [/autoit]
  • hö?

    du schreibst doch:

    Zitat

    das was der server recv. solla in ne text datei spiechern.
    macht er auch, bloß soller nach jedem ding was er kriegt,in ne neue zeile gehen, sprich enter drücken und da dann weiter machen.

    damit du in eine textdatei schreibst ohne das darüberliegende zu löschen musst kannst du es so machen wie ich gepostet habe.

    [autoit]

    $open = FileOpen ("C:/Message/recieved.txt", 1)
    ; natürlich nur eins der beiden ^^
    Filewrite($open, $recv); wenn @CrLf schon in $recv steht.
    Filewrite($open, @CrLf & $recv); wenn du in $recv noch keinen zeilenumbruch hast
    FileClose($open)

    [/autoit]
  • kay ^^ jetzt hab ich das Problem das der ne leere textdatei hat. die wird zwar größer und größer ^^ aber es steht nix drin :D

    //edit

    doch^^ er machts

    ermacht 1000 mal @crlf
    und dann schreibter das rein
    dann wieda 1000 ma @crlf un weiter^^

  • Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    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
    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))
    Filewrite("C:/Message/recieved.txt",$recv)
    $open = FileOpen ("C:/Message/recieved.txt", 1)
    Filewrite($open, @CrLf & $recv); wenn du in $recv noch keinen zeilenumbruch hast
    FileClose($open)
    WEnd

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

    so hab ichs jetzt.
    er erstellt den text macht 1000 mal enter, schreibst wieda rein und wieda 1000 mal enter ^^
    liegts an der while schleife?! bzw if yes, wiebau ich das dem entsprechend um?

    Einmal editiert, zuletzt von Kev (16. März 2010 um 15:58)

  • was für n gemeiner fehler :D

    ändere das:

    [autoit]

    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    Filewrite("C:/Message/recieved.txt",$recv)
    $open = FileOpen ("C:/Message/recieved.txt", 1)
    Filewrite($open, @CrLf & $recv); wenn du in $recv noch keinen zeilenumbruch hast
    FileClose($open)

    [/autoit]

    in das:

    [autoit]

    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    Filewrite("C:/Message/recieved.txt",$recv)
    $open = FileOpen ("C:/Message/recieved.txt", 1)
    Filewrite($open, @CrLf & $recv); wenn du in $recv noch keinen zeilenumbruch hast
    FileClose($open)
    endif

    [/autoit]
  • fast :D

    jetz macht ers so:

    Spoiler anzeigen

    ^^

    bzw kann ich net iwie sagen
    . 1 IP:
    . 2 IP:
    . 3 IP:

    und da die die daten alle 30 minuten kommen soller den alten eintrag in der txt mit dem neuen löschen^^
    aber nur mit der dazugehörenden ip.

    also wenn das ding auf 20 rechner kommt, und jeder ne andere ip hat. soller den alten eintrag mit der ip in der txt mit dem neuen austauschen :o
    geht das? if yes then wie?

  • wenn de mir sagst wie

    schau dir doch mal die beispiele zu iniread und iniwrite an. damit dus verstehst.

    lösen würd ich das ganze dann so in etwa:

    [autoit]

    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    IniWrite(@Scriptdir & "\recieved.ini", "Recieved", "<HierIPeinfügen>", $recv)
    EndIf

    [/autoit]
  • Kay, dann muss ich ja $recv splitten weil da ja net nur die ip drin ist.
    das heißt:

    [autoit]

    $IP = _StringBetween($recv , '" IP Adresse:"', '" Computername')

    [/autoit]

    sagter aber $IP wär net deklariert ^^

    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
    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')
    msgbox(1,"",$IP)

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

    EndIf
    Wend

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

    und client:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [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] [autoit][/autoit] [autoit][/autoit]
  • nach pm absprache entstand das:

    [autoit]

    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

    [/autoit]

    und nicht vergessen:

    [autoit]

    Include <String.au3>

    [/autoit]
  • achso du verwendest MustDeclareVars

    dann tausch z.B. die zeile:

    [autoit]

    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted

    [/autoit]


    gegen die aus:

    [autoit]

    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $ip, $host, $time

    [/autoit]