TCP Problem - Serverreaktion & Serverantwort

  • Jo, ich hätt da ma nen Problem... TCP treibt mich zum wahnsinn und ich weiss nich wie ich das lösen soll x3

    Zum einen muss gesagt sein dass ich den Server nicht Programmiert habe, er existiert schon... und funktioniert auch... zumindest kann ich Befehle mit PuTTY an den Server senden und bekomme auch entsprechende Antwort...

    Also, nun zu meinem Problem:
    Mein Script basiert auf einer GUI mit entsprechenden Eingabefeldern und Buttons(IP-Eingabefeld, Connect-Button etc.)
    Ich verbinde via TCPConnect zur gleichen IP und auf den gleichen Port die ich auch bei PuTTY eingegeben habe.
    Via If Anweisung überprüfe ich dann ob eine Verbindung hergestellt werden konnte (klappt auch immer)
    Als nächstes sende ich via TCPSend (gestartet von einem Button) ein Kommando an den Server... auch dies teste ich mittels einer If Anweisung und angeblich wurden die Daten immer erfolgreich gesendet
    Jedoch: Mein Server reagiert nicht, so als seien nie meine gesendeten Befehle bei ihm angekommen.

    Hinzu kommt noch dass der Server normalerweise nach jedem Befehl eine Antwort sendet ob dieser Befehl ausgeführt werden konnte oder nicht und wenn nicht dann warum nicht.
    Ich habe es bis jetz nicht hinbekommen und rätsel da schon mehrere Stunden dran rum, wie ich mit AutoIt diese Antwort empfangen kann um sie dann in einer MsgBox ausgeben zu lassen... vllt. kann mir da ja mal jemand ne Idee geben (Bei PuTTY kommen diese Antworten jedenfalls immer an).
    Ich habe schon versucht über TCPListen und TCPAccept die Antwort zu empfangen, jedoch mit geringem Erfolg:
    TCPListen klappt
    TCPAccept gibt dann aber -1 zurück, @error jedoch 0

    Einmal editiert, zuletzt von Karill Endusa (26. Dezember 2009 um 20:33)

  • Spoiler anzeigen
    [autoit]

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

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

    AutoIt Version: 3.3.2.0
    Author: Karill Endusa

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

    Script Function:
    rootz-network.de TeamSpeak3 Admin Console.

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

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

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

    ; Script Start - Add your code below here

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiIPAddress.au3>
    #Region ### START Koda GUI section ### Form=
    $window = GUICreate("rootz-network.de TeamSpeak3 Admin Console", 502, 402, 695, 213)
    $MenuItem1 = GUICtrlCreateMenu("&Datei")
    $MenuItem3 = GUICtrlCreateMenuItem("Schliessen", $MenuItem1)
    $MenuItem2 = GUICtrlCreateMenu("&Hilfe")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("In Development", 144, 192, 225, 41)
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
    $TCPConnectButton = GUICtrlCreateButton("Connect", 305, 27, 60, 25, $WS_GROUP)
    $TCPDisconnectButton = GUICtrlCreateButton("Disconnect", 370, 27, 75, 25, $WS_GROUP)
    $LoginButton = GUICtrlCreateButton("Login", 305, 57, 60, 25, $WS_GROUP)
    $WhoAmIButton = GUICtrlCreateButton("Send whoami", 370, 57, 75, 25, $WS_GROUP)
    $IPAddress1 = _GUICtrlIpAddress_Create($window, 147, 5, 153, 21)
    _GUICtrlIpAddress_Set($IPAddress1, "*.*.*.*")
    $InputSAPass = GUICtrlCreateInput("********", 147, 31, 153, 21)
    $Label1 = GUICtrlCreateLabel("Server-IP", 5, 5, 60, 21, -1, $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("serveradmin-passwort", 5, 31, 137, 21, -1, $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    Dim $window_AccelTable[1][2] = [["^+4", $MenuItem3]]
    GUISetAccelerators($window_AccelTable)
    #EndRegion ### END Koda GUI section ###

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

    TCPStartup()
    AutoItSetOption("ExpandVarStrings", 1)

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

    Global $socket
    Global $listenState = 0
    Global $connected = 0

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    beenden()

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

    Case $MenuItem3
    beenden()

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

    Case $TCPConnectButton
    Global $IPRead = _GUICtrlIpAddress_Get($IPAddress1)
    $socket = TCPConnect($IPRead, 10011)
    If $socket = -1 Then
    MsgBox(16, "Connect", "Verbindungsversuch fehlgeschlagen")
    Else
    MsgBox(0, "Connect", "Verbindung wurde hergestellt")
    $connected = 1
    EndIf

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

    Case $TCPDisconnectButton
    closeSocket()

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

    Case $LoginButton
    If $connected = 1 Then
    $sapasswort = GUICtrlRead($InputSAPass)
    ;~ MsgBox(0, "Test", "login serveradmin " & $sapasswort)
    $send = TCPSend($socket, "login serveradmin " & $sapasswort)
    If $send = 0 Then
    MsgBox(0, "Error", @error)
    EndIf
    $send = TCPSend($socket, "gm msg=test")
    If $send = 0 Then
    MsgBox(0, "Error", @error)
    EndIf
    Else
    MsgBox(16, "Login", "Du musst dich zuerst zum Server verbinden")
    EndIf

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

    Case $WhoAmIButton
    If $connected = 1 Then
    TCPSend($socket, "gm msg=test")
    Else
    MsgBox(16, "Login", "Du musst dich zuerst zum Server verbinden")
    EndIf
    EndSwitch

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

    WEnd

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

    Func beenden()
    closeSocket()
    TCPShutdown()
    Exit
    EndFunc

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

    Func closeSocket()
    If $connected = 1 Then
    Local $closeSocket = TCPCloseSocket($socket)
    If $closeSocket = 0 Then
    MsgBox(16, "Disconnect", "TCP Socket konnte nicht getrennt werden!")
    ElseIf $closeSocket = 1 Then
    MsgBox(0, "Disconnect", "TCP Socket wurde getrennt!")
    $connected = 0
    EndIf
    Else
    MsgBox(16, "Socket", "Es besteht keine Verbindung die getrennt werden müsste.")
    EndIf
    EndFunc

    [/autoit]

    Wie gesagt: Wie ich die Antwort des Server empfangen soll habe ich gerade gar keine Ahnung...
    Der Part mit dem TCPListen und TCPAccept ist in dieser Version schon wieder entfernt worden... ich dachte mir ich packe den erst wieder rein wenn überhaupt ma was vom Server aus passiert.

    //EDIT
    Code in nen Spoiler gepackt

    Einmal editiert, zuletzt von Karill Endusa (26. Dezember 2009 um 20:18)

  • Du musst immer mit @CRLF deine Befehle abschließen. Sonst weiß der Server nicht, wann du mit der Eingabe fertig bist ;) Z.B.

    [autoit]

    TCPSend($socket, "login serveradmin " & $sapasswort & @CRLF)

    [/autoit]
  • Ich danke dir, so klappt es^^...
    fehlt nur noch das Problem dass der Server nach jeden Befehl ja eine Antwort vom Server gesendet wird... und ich diese Antwort gerne empfangen und auslesen würde, weil sie manchmal wichtige Informationen enthält

  • Um nicht irgendwas falsch zu verstehen:
    bevor ich TCPRecv benutzen kann muss ich doch erstmal TCPListen und TCPAccept benutzen, oder?

    //EDIT
    ok hat sich erledigt ich hab nochma in der Function Referenz nachgeguckt xD

  • Um nicht irgendwas falsch zu verstehen:
    bevor ich TCPRecv benutzen kann muss ich doch erstmal TCPListen und TCPAccept benutzen, oder?


    Nein. Mit TCPConnect ist bereits eine Verbindung zwischen dir und dem Server aufgebaut. Diese kann gleichzeitig fürs Senden und Empfangen genutzt werden ;)