udp/tcp _ wie gehts?

  • hallo ich habe heute total lust bekommen so ne art fernwartungsprogramm zu schreiben...
    dazu werden die Clients auf den verschiedenen rechnern installiert(soll nachher über Internet gehen)
    und auf meinem läuft der server...nun soll mein server alle clients finden und ich soll die auswahl haben mich mit einem clienten zu verbinden..
    wenn ich zb mit meinem server einen befehl xy an den clienten sende soll eine funktion xz aufgerufen werden und diese auf dem clientenpc ausgeführt werden...
    nun habe ich mir dazu tcp und udp angeschaut, aber ich habe keinen blassen schimmer wie ich das machen soll...

    wäre echt super nett von euch wenn ihr mir so ne art starthilfe geben könntet...

  • ich würde tcp nehmen ist einfacher
    als bsp
    in der hilfe das von TCPRecv
    und TCPSENd
    hab ich auch am anfang verwendet und ausgebaut

  • könnte ich vlt auch den server und nen clienten gleichzeitig in einem script nutzen, damit ich zb nicht nur etwas sende sondern auch eine antwort bekomme ob es erfolgreich ausgeführt wurde?

  • daraus könnte man ein projekt machen wobei ich gerne mitmischen würde da ich schon ein eigenes tcp online spiel geschrieben hab und ein teamviewer remake der den desktop überträgt,tastendrücke überträgt,mausbewegung überträgt und mausklicke überträgt

  • also ich habe jetz mal ein skript gefunden, was mir schonmal einen einstieg ermöglicht:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.0.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ;CLIENT! Start server first please!!
    ;Autor: GtaSpider
    ;see TCPRecv example
    #include <GUIConstants.au3>

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

    ; Start The TCP Services
    ;==============================================
    TCPStartUp()

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

    ; Set Some reusable info
    ;--------------------------
    Dim $szServerPC = @ComputerName;Der Servername (@COmputername: der Computername des pcs wo das skript läuft)
    ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
    Dim $szIPADDRESS = TCPNameToIP($szServerPC);Hier wird der Name zur IP umgewandelt
    Dim $nPORT = 33891

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

    ; Initialize a variable to represent a connection
    ;==============================================
    Dim $ConnectedSocket = -1

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

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)

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

    Dim $szData

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

    ; If there is an error... show it
    If @error Then
    MsgBox(4112,"Error","TCPConnect failed with WSA error: " & @error)
    ; If there is no error loop an inputbox for data
    ; to send to the SERVER.
    Else
    ;Loop forever asking for data to send to the SERVER
    While 1
    ; InputBox for data to transmit
    $szData = InputBox("Data for Server",@LF & @LF & "Enter data to transmit to the SERVER:")

    ; If they cancel the InputBox or leave it blank we exit our forever loop
    If @error Or $szData = "" Then ExitLoop

    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket,$szData)

    ; If the send failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    If @error Then ExitLoop
    WEnd
    EndIf

    [/autoit]
    Spoiler anzeigen
    [autoit]

    ;SERVER!! Start Me First !!!!!!!!!!!!!!!
    ;Autor: GtaSpider
    #include <GUIConstants.au3>

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

    ; Set Some reusable info
    ; Set your Public IP address (@IPAddress1) here.
    Dim $szIPADDRESS = @IPAddress1
    Dim $nPORT = 33891

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

    ; Start The TCP Services
    ;==============================================
    TCPStartUp()

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

    ; Create a Listening "SOCKET".
    ; Using your IP Address and Port 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit

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

    ; Create a GUI for messages
    ;==============================================
    Dim $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")",300,200)
    Dim $edit = GUICtrlCreateEdit("",10,10,280,180)
    GUISetState()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    Dim $ConnectedSocket = -1

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

    ;Wait for and Accept a connection
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Get IP of client connecting
    Dim $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    Dim $msg, $recv
    ; GUI Message Loop
    ;==============================================
    While 1
    $msg = GUIGetMsg()

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

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

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

    ; Try to receive (up to) 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv( $ConnectedSocket, 2048 )

    ; If the receive failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    If @error Then ExitLoop

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

    ; Update the edit control with what we have received
    ;----------------------------------------------------------------

    If $recv = "a" then _a()
    If $recv = "b" Then _b()
    if $recv = "c" then _c()


    WEnd

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

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

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

    TCPShutDown()

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

    ; Function to return IP Address from a connected socket.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

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

    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
    "ptr",DLLStructGetPtr($sockaddr),"int_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

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

    Func _a()
    MsgBox(0, "", "Du hast a gesendet")
    EndFunc
    func _b()
    MsgBox(0, "", "du hast b gesendet")
    EndFunc
    func _c()
    MsgBox(0, "", "du hast c gesendet")
    EndFunc

    [/autoit]

    also das zweite script soll auf dem clienten laufen...geht das nun auch dass ich wie oben geschrieben aus mehreren verbindungen wählen kann und mich mit einem pc verbinde?

  • Hi Reader

    Du musst im Server wieder TcpSend anwenden und das empfangene senden und dann mit dem client diese empfangen eine andere mgl gibt es nicht

  • Warum TcpListen
    Im Client TcpRecv = Empfangen von gesendeten also

    [autoit]

    $recv = TcpRecv($hSocket,4096)
    If $recv <> "" Then
    ;Code
    Endif

    [/autoit]

    das gehört dann in die whileschleife

    und anstatt ;Code dann zb. mit guictrlsetdata in edit feld schreiben

  • ja ich meinte tcprecv, da sieht man mal wie wenig ich mich damit auskenne...

    das testen is das größte problem...jedes mal compilen und aufn selben rechner is eh so ne sache, also wäre es besser des aufn nem anderen den client und auf meinen den server, gibts da keine möglichkeit irgendwie zwei skripte uncompilet gleichzeitig laufen zu lassen?

  • wiso immer compilen klicke hald im explorer einfach auf beide dann läuft es
    bring es doch erst mal auf deimem rechner zum laufen und dann auf nem anderen
    ;)

  • oh ja genau ^^
    ja würde ich persönlich jetz auch mal sagen...könntest du mir vlt mal ein beispiel machen mit zb den fortschritt immer senden..am besten in mein script mitreinschreiben...wäre suuper..weil mit der zeit fehlt mir die motivation, weil ich keine erfolgsergebnisse habe

  • Das ist ja mal eine extrem faule Ausrede :D

    In der Hilfe sind doch funktionierende Beispiele - die du doch auch schon gepostet hast ;)
    Brauchst du doch nur abzuändern.
    Ansonsten - einfach ausprobieren, selbst tüfteln und bei richtig verzwickten Problemen: Fragen =)

    (Hört sich im Moment so an wie .. "schreibt mir mal bitte..")

    Entschuldigt, den Kommentar konnte ich mir nicht verkneifen :D

    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • hehe jaa das sagst du soo einfach...

    leider ist kein beispiel in der hilfe wie ich senden und empfangen in ein script mache...

  • Hier mal ein simples beispiel

    Cllient:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; CLIENT! Starte mich, nachdem der Server gestartet wurde!!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Example()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ;--------------------------
    Local $ConnectedSocket, $szData
    ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891,$recv

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

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

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

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

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

    ; Versucht, zu einem Server mit der IP und dem PORT 33891 zu verbinden.
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; Falls es einen Fehler gibt, wird er angezeigt
    If @error Then
    MsgBox(4112, "Fehler", "TCPConnect schlug mit folgendem WSA-Fehler fehl: " & @error)
    ; Wenn es keinen Fehler gibt, dann erscheint wiederholt eine Inputbox zur Eingabe von Daten, die zum Server gesendet werden sollen.
    Else
    ; Fragt fortwährend nach Daten, die zum Server gesendet werden sollen.
    While 1
    $recv = TcpRecv($ConnectedSocket,4096)
    If $recv <> "" Then MsgBox(0,"",$recv)

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

    ; InputBox für die zu versendenden Daten
    $szData = InputBox("Daten für den Server", @LF & @LF & "Gib Daten ein, die zum Server transferiert werden sollen:")

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

    ; Wenn die Inputbox geschlossen wird oder leer bleibt, wird die Schleife beendet.
    If @error Or $szData = "" Then ExitLoop

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

    ; Wir sollten Daten in $szData haben... Lasst uns versuchen, sie durch unseren verbundenen Socket zu versenden.
    TCPSend($ConnectedSocket, $szData) ; Wenn das Senden mit @error fehlgeschlagen ist, dann ist der Socket getrennt.
    ;----------------------------------------------------------------
    If @error Then ExitLoop
    WEnd
    EndIf
    EndFunc ;==>Example

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

    SErver:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Starte mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

    [/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("Mein Server (IP: " & $szIPADDRESS & ")", 300, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
    GUISetState()

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

    ; Eröffnet 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

    [/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, 2048)

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

    ; Wenn der Empfang mit @error fehlschlägt, dann ist der Socket getrennt.
    ;----------------------------------------------------------------
    If @error Then ExitLoop

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

    ; Erneuert das Edit Steuerelement mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    If $recv <> "" Then TcpSend($ConnectedSocket,$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][/autoit]

    Die gui im server ist überflüssig aber habs jetzt nicht weggemacht
    du must zwei mal wa senden damit du danach nach der 2Inputbox die Nachricht bekommst
    normal nicht so mit gui aber ich habe jetzt nciht so viel aufwand gemacht da ich nicht viel zeit hab
    das beispiel ist aus der hilfe nur abgewandt

  • Du kannst TCPSend und TCPRecv beide sowohl im Server
    als auch im Client verwenden.
    Im Server als Socket eben den aus TCPAccept, im Client den aus TCPConnect angeben.
    So einfach ist das ^^

    limette

    //Edit: Etwas zu spät =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • oke dann werde ich mir dein skript zu herzen nehmen und mal ein bisschen rumprobieren^^...danke dir ;)