TCP Send an Root Server

  • Heyho liebe AutoIt Community.


    Ich sitze jetzt 3 Stunden an dieser Funktion für mein Programm und ich komme einfach nicht weiter.
    Es handelt sich um eine einfache TCP Send Funktion, wenn man mein Programm startet, wird das Paket "Login" an meinen Root Server
    gesendet, die Server.exe die dort läuft schreibt das dann in die Console und in eine Log.txt.
    Wenn ich das Programm auf dem Root ausführe und es auf 127.0.0.1 verbinden lasse funktioniert es einwandfrei, das selbe auch wenn ich es
    local auf meinem PC benutze.
    Wenn ich nun aber auf meinem PC mein Programm starte, merkt man dass es zum Server verbinden kann.
    Habe getestet, wenn ich starte und Server.exe ist aus dann brauch mein Programm über 10sek zum starten, wenn es an ist braucht mein Programm eine Sekunde zum starten, also muss die Verbindung ja eigentlich erfolgreich aufgebaut worden sein.
    Jedoch schreibt der Server den Login nicht in die Konsole -.-.
    Ich hab jetzt schon tausenmal rumprobiert , root firewall aus, meinen firewall aus, beide firewall aus, local bei mir - geht, local aufm root - geht.
    Ich finde einfach nicht den Fehler X(

    Hoffe mir kann jemand helfen, hier die Scripts:


    Hier das Script für den Client.

    [autoit]


    $EnTCP = IniRead(@ScriptDir & "\Manager.ini", "Settings", "TCP", "")

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

    If $EnTCP = 1 Then
    TCPStartup()
    $Ip = "178.63.84.77"
    $Port = "3604"
    $OwnIP = _GetIP()

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

    $socket = TCPConnect ($ip, $port)
    $socket = TCPConnect ($ip, $port)
    TCPSend ($Socket,"Login|"&$OwnIP)
    endif

    [/autoit]


    Und hier das Script für den Server

    [autoit]


    #include <console_plus.au3>
    #include <Inet.au3>

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

    TCPStartup()

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

    $Ip = IniRead ("Config.ini", "Connection", "IP", "" )
    $Port = IniRead ("Config.ini", "Connection", "Port", "" )
    $MaxCon = IniRead ("Config.ini", "Connection", "MaxCon", "" )
    $MaxByte = IniRead ("Config.ini", "Connection", "MaxByte", "" )

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

    $MainSocket = TCPListen ($ip, $port, $maxcon)

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

    If $MainSocket = -1 Then
    MsgBox (16, "Error", "Es ist ein Fehler aufgetreten.")
    EndIf

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

    While 1
    $ConnectedSocket = TCPAccept ($MainSocket)
    If $ConnectedSocket >= 0 Then
    $Recv = TCPRecv ($ConnectedSocket, $maxbyte)
    $split = StringSplit ($Recv, "|")
    If $split[0] > 0 and $split[0] = 2 Then

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

    If $split[1] = "LOGIN" then
    _IN_WRITE($split[2])
    _IN_LOG($split[2])
    endif
    EndIf
    endif
    wend

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

    Func _IN_WRITE($IpAdresse)
    $time = "["&@MDAY&"."&@MON&"."&@YEAR&", "&@HOUR&":"&@MIN&"]"
    _ConsoleSetColor($_CONSOLE_WHITE, $_CONSOLE_BLACK)
    ConsoleWrite(@CRLF&$time)
    _ConsoleSetColor($_CONSOLE_GREEN, $_CONSOLE_BLACK)
    ConsoleWrite(" [LOGIN ] ")
    _ConsoleSetColor($_CONSOLE_WHITE, $_CONSOLE_BLACK)
    ConsoleWrite("| ")
    ConsoleWrite($IpAdresse)
    EndFunc

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

    Func _IN_LOG($IpAdresse)
    $time = "["&@MDAY&"."&@MON&"."&@YEAR&", "&@HOUR&":"&@MIN&"]"
    FileWrite("Log.txt",@CRLF&$time&" [LOGIN ] | "&$IpAdresse)
    EndFunc

    [/autoit]
  • 2 Sachen die wichtig für den Server sind:

    1.: Der server hört auf die Interne IP-Adresse, nicht die Öffentliche
    2.: Es besteht ein Port-Forwarding für den benutzten Port.

  • Hi

    Was mir beim Client aufgefallen ist:

    [autoit]

    $socket = TCPConnect ($ip, $port)
    $socket = TCPConnect ($ip, $port)

    [/autoit]


    Warum steht TCPConnect zwei mal drin? Einmal Connecten reicht.

    Was mir beim Server aufgefallen ist:

    [autoit]

    $ConnectedSocket = TCPAccept ($MainSocket)

    [/autoit]


    steckt in der gleichen While-Schleife wie

    [autoit]

    $Recv = TCPRecv ($ConnectedSocket, $maxbyte)

    [/autoit]


    ich glaube da liegt der Fehler.

    Ersetze mal:

    [autoit]

    While 1
    $ConnectedSocket = TCPAccept ($MainSocket)
    If $ConnectedSocket >= 0 Then
    $Recv = TCPRecv ($ConnectedSocket, $maxbyte)
    $split = StringSplit ($Recv, "|")
    If $split[0] > 0 and $split[0] = 2 Then

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

    If $split[1] = "LOGIN" then
    _IN_WRITE($split[2])
    _IN_LOG($split[2])
    endif
    EndIf
    endif
    wend

    [/autoit]

    mit

    [autoit]

    Do
    $ConnectedSocket = TCPAccept ($MainSocket)
    Until $ConnectedSocket <> -1

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

    While 1
    $Recv = TCPRecv ($ConnectedSocket, $maxbyte)
    If $Recv <> "" Then
    $split = StringSplit ($Recv, "|")
    If $split[0] = 2 Then
    If $split[1] = "LOGIN" then
    _IN_WRITE($split[2])
    _IN_LOG($split[2])
    EndIf
    EndIf
    EndIf
    WEnd

    [/autoit]
  • Danke für eure Antworten.
    Leider funktioniert es mit dem vorgeschlagenen Code noch weniger, mit diesem funktioniert es nicht einmal mehr local.

  • Hab das hier lokal getestet und es funktioniert!
    Probier mal bitte diese beiden Skripte, aber lass sie unverändert!

    [Edit]
    Im Client musst du natürlich die Var $Ip anpassen :whistling:

    Client:

    Spoiler anzeigen
    [autoit]

    $Ip =
    $Port = "3604"
    TCPStartup()
    $socket = TCPConnect($Ip, $Port)
    TCPSend($socket, "Login|" & @IPAddress1 & " Nachricht")

    [/autoit]

    Server:

    Spoiler anzeigen
    [autoit]

    $Ip = @IPAddress1
    $Port = "3604"

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

    TCPStartup()
    $MainSocket = TCPListen($Ip, $Port)
    If $MainSocket = -1 Then
    MsgBox(16, "Error", "Es ist ein Fehler aufgetreten.")
    EndIf

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

    While 1
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    While 1
    $Recv = TCPRecv($ConnectedSocket, 2048)
    If @error Then ExitLoop
    If $Recv <> "" Then
    $split = StringSplit($Recv, "|")
    If $split[0] = 2 Then
    If $split[1] = "LOGIN" Then
    _IN_WRITE($split[2])
    _IN_LOG($split[2])
    EndIf
    EndIf
    EndIf
    WEnd
    WEnd

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

    Func _IN_WRITE($IpAdresse)
    $time = "[" & @MDAY & "." & @MON & "." & @YEAR & ", " & @HOUR & ":" & @MIN & "]"
    ConsoleWrite(@CRLF & $time)
    ConsoleWrite(" [LOGIN ] ")
    ConsoleWrite("| ")
    ConsoleWrite($IpAdresse)
    EndFunc ;==>_IN_WRITE

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

    Func _IN_LOG($IpAdresse)
    $time = "[" & @MDAY & "." & @MON & "." & @YEAR & ", " & @HOUR & ":" & @MIN & "]"
    FileWrite("Log.txt", @CRLF & $time & " [LOGIN ] | " & $IpAdresse)
    EndFunc ;==>_IN_LOG

    [/autoit]
  • Hm mit dem Script funktionier zwar auch local client ---> local server
    aber local client ---> Remote Server funktioniert immer noch nicht, ob mit oder ohne firewall.

  • Also bei mir klappt es!

    Allein die Firewall zu überprüfen reicht nicht aus!
    Wie sieht es mit deinem Router aus? Hast du dort den TCP-Server überhaupt eingestellt?

  • Zitat


    @IPAddress1 IP-Adresse des ersten Netzwerk-Adapters. Gibt auf manchen Systemen 127.0.0.1 zurück.

    Lass dir also im Server mal die IP Adresse in einer msgbox ausgeben an der gelauscht wird und kontrolliere ob wirklich die IP des Netzwerkadapters verwendet wird mit dem du ins Internet verbunden bist.
    Und dann wäre eben noch die Frage ob es sich um einen dedizierten Server in einem Rechenzentrum handelt, oder ob es sich um einen Server in einem privaten Netzwerk handelt. In letzterem Fall ist ggf. noch ein Portforwarding im Router nötig.

  • Zitat

    1.: Der server hört auf die Interne IP-Adresse, nicht die Öffentliche
    2.: Es besteht ein Port-Forwarding für den benutzten Port.


    Trifft das überhaupt auf root Server zu?
    Meines Erachtens sind die komplett oder teilweise aber über eine eigne öffentliche IP bzw. DNS-Eintrag erreichbar.
    http://www.rootforum.org/wiki/Entscheidungshilfe

    Btw. nen root Server wo Windows drauf läuft... klingonisch ist aber so :D
    Gut wir hosten Windows Software via ASP und brauchen sowas, auch aber wer noch?

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o