Hilfe bei TCP Script

  • Hallo liebe Leute,
    ich bin seit kurzer Zeit daran ein kleines Tool zu schreiben. Ein paar Infos:
    Was soll es können:
    Es soll ein kleiner einseitiger Test Chat sein (auch mit Befehlen, CDTray, etc.).
    Wie siehts aus, wo ist dein Problem:
    Ich habe die beiden Komponeneten eigentlich fertig, aber es hapert an der Verbindung (beides erstmal auf einem Pc), früher hat es
    geklappt, also was mache ich falsch?
    Es wäre nett von euch, wenn ihr mal in meine beiden Scripte reinschaut (sry für die Unordnung). Schonmal vielen Dank für eure Mühen!
    Mfg,
    Albtraum²

    Hier die beiden Scripte:

    Server:

    [autoit]

    HotKeySet("{ESC}", "_Exit")
    Func _Exit()
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    EndFunc

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

    TCPStartup()
    Global $ip = @IPAddress1
    MsgBox(0, "IP", $ip)
    While 1
    $mainsocket = TCPListen( $ip, 4321)
    $acceptsocket = TCPAccept( $mainsocket)
    If $acceptsocket <> -1 Then
    $resivedData = TCPRecv( $acceptsocket, 1024)
    If $resivedData = "CDTray" Then
    CDTray("D:", "open")
    Else
    MsgBox(0, "Nachricht von Client", $resivedData)
    EndIf
    EndIf
    TCPCloseSocket( $acceptsocket)
    WEnd

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

    Und hier der Cleint (schon mit kleiner Gui (das Ip Feld geht noch net, aber das schaff ich alleine, erstmal dass das andere alles klappt ;):

    [autoit]

    TCPStartup()
    Global $ip = InputBox("Ip", "Bitte Ip angeben")
    Global $socket = TCPConnect( $ip, 4321)
    If $socket = -1 Then
    MsgBox(0, "Verbindungsfehler", "Verbingdungsaufbau zum Server gescheitert")
    EndIf
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("RAT - by Albtraum²", 317, 180, 355, 194)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 9, 8, 212, 19)
    _GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
    $Button1 = GUICtrlCreateButton("Connect", 232, 9, 57, 20, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("CD-Tray", 9, 40, 66, 26, $WS_GROUP)
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    Case $nMsg = $Button2
    Local $input = "CDTray"
    $send = TCPSend( $socket, "CDTray")
    If $send = 0 Then
    MsgBox(0, "Sendefehler", "Daten konnten nicht gesendet werden!")
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von Albtraum² (18. März 2014 um 17:04)

  • Ich weiß nicht ob dies dein Problem löst aber Zeile 22 deines Server-Skripts schließt einen Socket und zwar unabhängig ob es überhaupt ein gültiger Socket ist. Der Socket sollte nur geschlossen werden wenn er wirklich nicht mehr gebraucht wird.

    Ich empfehle dir die Beispielskripts zu TCPConnect und TCPListen von AutoIt anzuschauen. Vielleicht helfen diese dir mehr weiter das Problem zu lösen.

  • Hallo,
    schonmal Danke, an dich! Mein Problem hat es nicht gelöst... :(
    Ich habe selber noch ein wenig rum probiert, mir auch mal die Hilfe durchgelesen, hat aber
    nix gebracht!
    Der jetztige Stand ist der:
    Antscheinend sendet der Client ganz brav alles, gibt auch keine Fehlermeldungen etc.
    Der Server scheint die Daten zwar anzunehmen, aber er macht nichts mit ihnen!
    Hier sind nochmal die beiden Scripte (überarbeitet), es wäre nett, wenn ihr nochmal nen Blick
    drauf werfen könntet, schonmal Danke!
    Mfg,
    Albtraum²

    Client:

    [autoit]

    TCPStartup()
    Global $ip = InputBox("Ip", "Bitte Ip angeben")
    Global $socket = TCPConnect( $ip, 4321)
    If $socket = -1 Then
    MsgBox(0, "Verbindungsfehler", "Verbingdungsaufbau zum Server gescheitert")
    EndIf
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("RAT - by Albtraum²", 317, 180, 355, 194)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 9, 8, 212, 19)
    _GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
    $Button1 = GUICtrlCreateButton("Connect", 232, 9, 57, 20, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("CD-Tray", 9, 40, 66, 26, $WS_GROUP)
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    Case $nMsg = $Button2
    Local $input = "CDTray"
    $send = TCPSend( $socket, "CDTray")
    If $send = 0 Then
    MsgBox(0, "Sendefehler", "Daten konnten nicht gesendet werden!")
    EndIf
    EndSelect
    WEnd

    [/autoit]


    Server:

    [autoit]

    HotKeySet("{ESC}", "_Exit")
    Func _Exit()
    TCPCloseSocket( $acceptsocket)
    TCPShutdown()
    Exit
    EndFunc

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

    TCPStartup()
    Global $ip = @IPAddress1
    MsgBox(0, "IP", $ip)
    While 1
    $mainsocket = TCPListen( $ip, 4321)
    Global $acceptsocket = TCPAccept( $mainsocket)
    If $acceptsocket <> -1 Then
    $resivedData = TCPRecv( $acceptsocket, 1024)
    If $resivedData = "CDTray" Then
    CDTray("D:", "open")
    Else
    MsgBox(0, "Nachricht von Client", $resivedData)
    EndIf
    EndIf
    WEnd

    [/autoit]
  • [autoit]

    If $socket = -1 Then
    MsgBox(0, "Verbindungsfehler", "Verbingdungsaufbau zum Server gescheitert")
    EndIf

    [/autoit]

    Kann dir zwar bei diesem Thema nicht helfen weil ich mich nicht wirklich damit auskenne aber kann $socket nich auch als Fehler 0 sein?
    Da wäre es dann doch besser auf @error zu checken anstatt auf $socket

    Edit: $acceptsocket ist bei mir immer -1
    Hab grad deine scripts mal ausgeführt und nach

    [autoit]

    Global $acceptsocket = TCPAccept( $mainsocket)

    [/autoit]


    ist @error = 10038

    Mal nachgeguckt was der @error heisst:
    WSAENOTSOCK10038
    Socket operation on nonsocket.
    An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.

    Keine Ahnung ob das daran liegt das ich was falsch gemacht habe oder ob was im Script ned stimmt ;)

    Ich schätze mal, dass der Fehler bei mir irgendwo zwischen meiner Tastatur und dem Stuhl zu finden ist.
    Wahrscheinlich ist bei mir der Port zu oder sowas :P

    Apropo geschlossene Ports. Schonmal ohne eingeschaltetes Antiviren Programm getestet? Die könnten ja auch eventuell Ports blocken.
    Aber wie gesagt: Ich kenn mich da nicht aus ^^

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]

    4 Mal editiert, zuletzt von Blubkuh (12. März 2014 um 17:56)

  • Der Fehler liegt beim Serverscipt.

    [autoit]


    $mainsocket = TCPListen( $ip, 4321)

    [/autoit]


    sollte vor der While-Schleife einmal ausgeführt werden und nicht in der While-Schleife. Sonst wird der Socket ja hunderte male pro Sekunde geöffnet und da er ja dann schon geöffnet ist, gibt das nen Fehler.

  • Der Fehler liegt beim Serverscipt.

    [autoit]


    $mainsocket = TCPListen( $ip, 4321)

    [/autoit]


    sollte vor der While-Schleife einmal ausgeführt werden und nicht in der While-Schleife. Sonst wird der Socket ja hunderte male pro Sekunde geöffnet und da er ja dann schon geöffnet ist, gibt das nen Fehler.

    Das war mir auch schon aufgefallen und hatte ich vergessen in meiner Nachricht zu schreiben. funktioniert (zumindest bei mir) trotzdem nicht. $acceptsocket gibt bei mir -1 mit oben genannten @error aus

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Probier mal die IP des Servers auf 127.0.0.1 zu setzen (also auf deinen eigenen PC zurück) und schau dann, ob der Fehler auftritt. Ansonsten die Ports bei der fritzbox (oder deinem Router eben) freigeben und schauen ob es dann funktioniert

  • Probier mal die IP des Servers auf 127.0.0.1 zu setzen (also auf deinen eigenen PC zurück) und schau dann, ob der Fehler auftritt. Ansonsten die Ports bei der fritzbox (oder deinem Router eben) freigeben und schauen ob es dann funktioniert


    127.0.0.1 hatte ich vorher schon probiert und da ging es auch nicht. Zugriff auf den Router habe ich leider nicht also kann ich ned gucken ob Ports offen/gescglossen sind.
    Habe grade diverse online Portscanner ausprobiert und die sagen sogar, dass mein Port 80 angeblich geschlossen ist/nicht reagiert ^^

    Naja vielleicht liegt das ja an meinem Router und das Script funktioniert beim OP

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Hallo liebe Forenfreunde,
    es geht zwar immer noch nicht, aber ich habe mal ein bisschen rumprobiert und habe somit 2 funktionierende
    Scripts, ich weiß allerdings nicht, wo das Problem liegt (bei den anderen Scripts). Bitte nochmal drüberschauen,
    wäre nett, Danke!
    Lg,
    Albtraum²

    Hier die funktionierenden:
    Client:

    [autoit]

    TCPStartup()
    $socket = TCPConnect("127.0.0.1", 4432)

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

    If $socket = -1 Then
    MsgBox(0, "Fehler!", "Keine Verbng. möglich")
    EndIf

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

    $sendedbytes = TCPSend($socket, "Hallo")
    If $sendedbytes = 0 Then
    MsgBox(0, "Fehler!", "Nicht gesendet")
    EndIf
    TCPCloseSocket($socket)
    TCPShutdown()

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


    Server:

    [autoit]

    TCPStartup()
    $mainsocket = TCPListen("127.0.0.1", 4432)

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

    While 1
    $acceptedsocket = TCPAccept($mainsocket)
    If $acceptedsocket <> -1 Then
    $resiveddata = TCPRecv($acceptedsocket, 1240)
    MsgBox(0, "Daten", $resiveddata)
    EndIf
    TCPCloseSocket($acceptedsocket)
    WEnd

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

    Und hier die neueste Version des eigentlichen Scripts:
    Client:

    [autoit]

    TCPStartup()
    Global $ip = InputBox("Ip", "Bitte Ip angeben")
    Global $socket = TCPConnect( $ip, 4321)
    If $socket = -1 Then
    MsgBox(0, "Verbindungsfehler", "Verbingdungsaufbau zum Server gescheitert")
    EndIf
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Client-Server - by Albtraum²", 317, 180, 355, 194)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 9, 8, 212, 19)
    _GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
    $Button1 = GUICtrlCreateButton("Connect", 232, 9, 57, 20, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("CD-Tray", 9, 40, 66, 26, $WS_GROUP)
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    Case $nMsg = $Button2
    Local $input = "CDTray"
    $send = TCPSend( $socket, "CDTray")
    If $send = 0 Then
    MsgBox(0, "Sendefehler", "Daten konnten nicht gesendet werden!")
    EndIf
    EndSelect
    WEnd

    [/autoit]


    Server:

    [autoit]


    HotKeySet("{ESC}", "_Exit")
    Func _Exit()
    TCPCloseSocket( $acceptsocket)
    TCPShutdown()
    Exit
    EndFunc

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

    TCPStartup()
    ;Global $ip = @IPAddress1
    Global $ip = "127.0.0.1"
    MsgBox(0, "IP", $ip)
    $mainsocket = TCPListen( $ip, 4321)
    While 1
    Global $acceptsocket = TCPAccept( $mainsocket)
    If $acceptsocket <> -1 Then
    $resivedData = TCPRecv( $acceptsocket, 1240)
    If $resivedData = "CDTray" Then
    CDTray("E:", "open")
    Else
    MsgBox(0, "Nachricht von Client", $resivedData)
    EndIf
    EndIf
    WEnd

    [/autoit]

    Ps: Ich finde es Klasse, dass ich so viele Antworten bekomme, an alle: Weiter so, finde ich cool :thumbup:

  • Wieso "Akzeptierst" du neue Verbindungen wenn sich ein Client schon mit den Server verbunden hat?
    Ich denke mal da liegt das Problem.
    Erstell die Variable $acceptsocket einfach vor der While Schleife mit den Wert -1
    Dann fragst du im Script ab ob diese den Wert -1 hat. Wenn ja verwendest du TCPAccept().
    Wenn du dadurch jetzt eine Verbindung ermöglicht hast ist $acceptsocket nicht mehr -1.
    Dann machst du einfach eine 'If $acceptsocket <> -1 Then' abfrage.
    Da drunter dann halt dein Code in den du die Pakete annimmst und diese auch weiterverarbeitest (TCPRecv, If * = * then, CDTray("E:", "open"), ...)

    In den Spoiler findest du deinen Server wie er funktionieren sollte.
    (Wenn du meinen Text nicht entschlüsseln kannst. ^^)

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}", "_Exit")
    Func _Exit()
    TCPCloseSocket( $acceptsocket)
    TCPShutdown()
    Exit
    EndFunc

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

    TCPStartup()
    ;Global $ip = @IPAddress1
    Global $ip = "127.0.0.1"
    MsgBox(0, "IP", $ip)
    $mainsocket = TCPListen( $ip, 4321)
    ;-- Ab hier wurde was verändert! ;)
    $acceptsocket = -1
    While 1
    If $acceptsocket = -1 Then
    $acceptsocket = TCPAccept( $mainsocket)
    ElseIf $acceptsocket <> -1 Then
    $resivedData = TCPRecv( $acceptsocket, 2048, 1)
    $resivedData = BinaryToString($resivedData)
    If $resivedData = "CDTray" Then
    CDTray("E:", "open")
    MsgBox(64, "", "CD TRAY!", 1500)
    ElseIf $resivedData <> "" Then
    MsgBox(16, "Nachricht von Client", $resivedData)
    EndIf
    EndIf
    WEnd
    ;-- Bis hier! ;)

    [/autoit]

    Einmal editiert, zuletzt von RG778 (31. August 2014 um 06:58)

  • Hallo,
    Vielen Lieben Dank!!! :D :D :D Es geht!
    Und gut, dass du nen Spoiler gemacht hast, dan konnte ich es auch selbst versuchen ;)
    Klasse, weiter so!
    Ich schreibe erst jetzt, weil ich am Wochenende keine Zeit hatte
    Lg,
    Albtraum²

    @mods: Das Thema kann geschlossen werden!

  • Geschlossen werden Themen hier generell nicht.
    Aber es wäre nett wenn du das Thema auf gelöst setzen könntest. Einfach ersten Post bearbeiten, Präfix gelöst wählen und Absenden ;)