TCP Server sendet nichts

  • Hallo,

    ich habe folgendes Problem undzwar sendet mein Server nichts an meinem Clienten. Ich benutzte Dyndns.
    Ich hoffe ihr könnt mir helfen

    hier ist der Server:

    Spoiler anzeigen
    [autoit]

    #include <date.au3>
    ; Starten von TCP
    TCPStartup()

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

    $serverIP = @IPAddress1 ; normalerweise die IP des Servers
    $serverport = 33891

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

    $srvSocket = TCPListen($serverIP,$serverport)

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Server Kontrolle", 625, 443, 700, 50)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 593, 417)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $con = TCPAccept($srvSocket)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If $con >=0 Then
    $rev = ''
    $clientIP = SocketToIP($con)
    ConsoleWrite(@LF & $clientIP)
    While True
    $rev &= TCPRecv($con,2048)
    If @error Then ExitLoop
    WEnd

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

    If StringLeft($rev,8) = 'MSGPORT#' Then
    $sp = StringSplit($rev,'#')

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

    $cltSocket = TCPConnect($clientIP,$sp[UBound($sp) - 1])
    If $clientIP <> -1 Then
    TCPSend($cltSocket,GUICtrlRead($Edit1))
    TCPCloseSocket($cltSocket)
    EndIf
    ElseIf $rev <> '' Then
    $str = GUICtrlRead($Edit1)
    $str &=_Now() & @TAB & $rev & @CRLF
    GUICtrlSetData($Edit1,$str)
    EndIf
    EndIf
    Sleep(50)
    WEnd

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

    Und dann noch der Client

    Spoiler anzeigen
    [autoit]

    $ip = @IPAddress1 ; normalerweise @IPAddress1
    $port = 7661

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

    $serverport = 33891

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

    ; Starten von TCP
    TCPStartup()
    $serverIP = TCPNameToIP("autoitpokemon.dyndns.org") ; normalerweise die IP des Servers

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

    AdlibRegister('empfang',5000)
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Chat Client 1", 625, 336, 10, 10)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 601, 281, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    ;GUICtrlSetData(-1, "Edit1")
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    $Button1 = GUICtrlCreateButton("Senden", 528, 304, 89, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $mySocket = TCPListen($ip,$port)

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

    While 1
    $con = TCPAccept($mySocket)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ; Sitzung aufbauen
    $srvSocket = TCPConnect($serverIP, $serverport)
    ; Bei einem Fehler Skript beenden
    If $srvSocket = -1 Then Exit
    ; Daten senden
    TCPSend($srvSocket, GUICtrlRead($Input1))
    ; Sitzung schliessen
    TCPCloseSocket($srvSocket)
    empfang()
    EndSwitch
    If $con >=0 Then
    $rev = ''

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

    While True
    $rev &= TCPRecv($con,2048)
    If @error Then ExitLoop
    WEnd
    If $rev <> '' Then
    $str = $rev
    GUICtrlSetData($Edit1,$str)
    EndIf
    EndIf
    Sleep(50)

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

    WEnd

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

    Func empfang()
    AdlibUnRegister()
    $srvSocket = TCPConnect($serverIP, $serverport)
    ; Bei einem Fehler Skript beenden
    If $srvSocket = -1 Then Exit
    ; Daten senden
    TCPSend($srvSocket, 'MSGPORT#' & $port)
    ; Sitzung schliessen
    TCPCloseSocket($srvSocket)
    AdlibRegister('empfang',5000)
    EndFunc

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

    ; Beenden von TCP
    TCPShutdown()

    [/autoit]

    Mfg
    blacky94

  • Geht den Client/Server den lokal ? Wenn ja kann es entweder eine nicht eingerichtete Routerweiterleitung oder die Firewall sein.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich habe bereits eine Ausnahme in meiner Firewall hinzugefügt und den Port in meinen Router ebenfalls weitergeleitet lokal funktioniert es aber wunderbar :/.

  • Benutze auch DynDNS, manchmal klappts, manchmal nicht (Beim gleichen Server/Client!) Vllt liegt das daran das der Name der als Konstante für die wechselnde IP nicht immer = IP ist, also langsam wechselt bei z.B. Router neustart. Kenn mich leider garnicht damit aus, wie das alles im Detail funktioniert, ist nur eine Vermutung.

    Kann man evtl testen indem du dir deine IP ausgeben lässt (nicht die Lokale) und dann die, die von TCPNameToIP returnt wird.

  • Das Problem ist das es noch nie funktioniert hat also der Server hat noch nie etwas zurückgesendet. Ich habe meine IP mithilfe von _GetIp und die von der verarbeitung von TCPNameToIP ausgegeben sie sind beide gleich.
    Ich habe auch den Dyndns Updater auf meinem Rechner installiert der die IP für meinen Server automatisch wechselt soblad sich meine IP wechselt. Danke für deine Bemühungen :) .

  • Hast mal geschaut ob der Updater auch wirkilich deine externe IP einträgt und nicht deine interne lokale Rechnerip?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ja das tut er :/ trotzdem danke für deine Antwort
    Hier sind ein paar Bilder vom Dyndns Updater und meinen Router Einstellungen vielleicht habe ich dort etwas falsch gemacht :/

    Spoiler anzeigen
  • Moin,

    wie es aussieht hats du einen Telekom Router - daran ist nicht schlimmes, ich habe auch einen.

    Wenn du aber von deinem Rechner nach aussen willst und gleich wieder rein - dann könnte das Problem sein. Es gibt Router die können das nicht
    Du kommst von innen, willst auf einen Port der externen IP deines Routers (also 2. Netzwerkschnittstelle deines Routers) und gleich wieder rein.

    Hast du 2 verschiedene Rechner im Netzwerk? Wenn ja bitte die Weiterleitung zum anderen und dort auf Empfang - dann könnte es gehen.

    mmh, ich glaube ich test mal bei mir ...

  • Ich glaube es ist die Goldene Netzwerkregel:

    Zitat

    hast du keine Verbindung obwohl alles in Ordnung erscheint, fehlt der Rückweg!

    Sehe ich das Richtig das der Client-Server in beide Richtungen kommunizieren?

    Dann muss der Zielrechner eine Portweiterleitung auf 33891 haben - und der Quellrechner auch.
    Wenn du das bei dir lokal machst und den Port 33891 auf den einen leitest - wie soll denn der andere etwas bekommen.

    Da wir TCP benutzen wollen alle Pakete brav mit Hingebracht werden - und eine Empfangsbestätigung zurücksenden.

    BLinz

  • Ich verstehe es nicht so ganz. Wenn ich bei meinem Client(Zielrechner) den Port auf 33891 setzte dann verbindet er sich nicht mit dem Server sondern beendet sich. Ich starte den Client auf den selben Rechner auf dem ich den Server starte und ja ich habe mehrere Rechner im Netztwek insgesamt 3
    /Danke für deine Antworten

    Einmal editiert, zuletzt von blacky94 (14. November 2011 um 00:08)

  • Überleg dir wie die TCP-IP Pakete laufen - Nachfolgend Pakete genannt:

    Zuerst lokales Netz (habe ich getestet, läuft ja)

    Rechner A startet den Server. (192.168.1.10)
    Rechner B startet den Client. (192.168.1.11)

    B baut Verbindung zu A auf (192.168.1.11 Port 33891 zu 192.168.1.10 Port 33891)
    und sendet Daten ...
    Dann geht dann ein Paket den Weg: 192.168.1.11 Port 33891 zu 192.168.1.10 Port 33891
    und die Bestätigung (fest im TCP protokoll eingebaut) diesen: 192.168.1.10 Port 33891 zu 192.168.1.11 Port 33891

    Wunderbar!

    Nun das ganze mit Firewall - wie es sein sollte:

    Rechner A: extern "RechnerA.dyndns.org" - Firewall sendet Port 33891 extern auf Rechner A 192.168.1.10 intern Port 33891
    Nun an einem anderen DSL Anschluss!!!
    Rechner B: extern "RechnerB.dyndns.org" - Firewall sendet Port 33891 extern auf Rechner B 192.168.178.2 intern Port 33891

    Rechner A startet Server
    Rechner B startet Client

    B baut Verbindung zu A auf (RechnerA.dyndns.org Port 33891 weitergeleitet zu intern 192.168.1.10 Port 33891)
    und sendet Daten ...
    Dann geht dann ein Paket den Weg: RechnerA.dyndns.org Port 33891 weitergeleitet zu intern 192.168.1.10 Port 33891
    und die Bestätigung (fest im TCP protokoll eingebaut) diesen: RechnerB.dyndns.org Port 33891 weitergeleitet zu intern 192.168.178.2 Port 33891

    So. hast du beides im gleichen Netz dann ... wie soll er weiterleiten? du kannst einen Port nur zu einem Rechner weiter leiten.

    mhh .. warum funktioniert RSync bei mir eigentlich intern ..... (Grübel)

  • Vielen danke für die Aufklärung, daher ist es nicht möglich den Server und den Client Online im selben Netzwerk zu starten nur Lokal?

  • Also bei mir im lokalen Netzwerk zwischen 2 Rechnern haben deine Originalskripte problemlos funktioniert - oder was ist jetzt genau deine Frage?

    Ggf. mal die Firewalleinstellungen beachten (port freischalten, ging bei mir aber ohne)

  • Meine Frage war ob 2 Rechner aus dem gleichen Netzwerk über einen Dyndns Server connecten können. Habe mir den Post oben von dir nochmal genauer durchgelsen und weiß jetzt das es nicht funktioniert. Danke für deine hilfe.

  • Naja,

    du kannst "schummeln" ... für extern halt das Dyndns, für intern schreibts du dir einfach den dyndns namen in die lokale host datei mit der IP des anderen Rechners

    c:\Windows\System32\drivers\etc\hosts

    ist die Datei

  • Muss dort nicht meine IP reinschreiben und danach den Namen des Dyndns Server. Dann müsste ich theoritisch nach jeden IP wechsel die hosts Datei ändern oder nicht?

  • Neee,

    du schreibt dort die IP des anderen Rechners im Netzwerkes zu DynDns Adresse.

    Bist du RechnerA schreibst du da die IP von RechnerB rein.

    So kannst du in deinem Skript für Test's trotzdem die DynDns Adresse verwenden