TCP Problem

  • Nabend...
    Ich habe ein Problem mit folgendem Script:

    Spoiler anzeigen
    [autoit]

    Func _SendFolderViaTCP($FolderPath,$ToIP,$ToPort)
    ToolTip("Starte TCP...",0,0)
    TCPStartup()
    $Socket = TCPConnect($ToIP,$ToPort)
    If $Socket = -1 Then
    MsgBox(64,"Info","Konnte nicht zum Server verbinden.")
    Exit
    EndIf
    ToolTip("Zippe Ordner...",0,0)
    _ZipFolder($FolderPath,"temp.zip")
    ToolTip("Wandle gezippten Ordner zu Binary um...",0,0)
    $FileToBinary_Read = FileRead("temp.zip")
    $FileToBinary = Binary($FileToBinary_Read)
    ToolTip("Lösche temporäre Zip...",0,0)
    FileDelete("temp.zip")
    ToolTip("Sende Zip...",0,0)
    TCPSend($Socket,$FileToBinary)
    MsgBox(64,"Info","Ordner erfolgreich gesendet!")
    ToolTip("Beende TCP...",0,0)
    TCPCloseSocket($Socket)
    TCPShutdown()
    EndFunc

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

    Func _RecvFolderViaTCP($FromIP,$FromPort)
    ToolTip("Starte TCP...",0,0)
    TCPStartup()
    $Socket = TCPListen($FromIP,$FromPort)
    ToolTip("Warten auf Verbindung...",0,0)
    While 1
    $AcceptedSocket = TCPAccept($Socket)
    If $AcceptedSocket <> -1 Then
    ToolTip("Empfange Binary...",0,0)
    $ReceivedData = TCPRecv($AcceptedSocket, 9999999999999999999999999999999999999999999999)
    ToolTip("Schreibe Binary in Zip...",0,0)
    FileWrite("temp.zip",$ReceivedData)
    ToolTip("Unzippe Zip...",0,0)
    _UnZipFolder("temp.zip")
    ToolTip("Lösche temporäre Zip...",0,0)
    FileDelete("temp.zip")
    ToolTip("Ordner erfolgreich empfangen!",0,0)
    Sleep(2000)
    ToolTip("Beende TCP...",0,0)
    EndIf
    TCPCloseSocket($AcceptedSocket)
    TCPCloseSocket($Socket)
    TCPShutdown()
    WEnd
    EndFunc

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

    Func _ZipFolder($FolderPath,$Output = "Zipped.zip")
    FileInstall("7za.exe","7za.exe")
    Sleep(1000)
    run("7za.exe a " & '"' & $Output & '"' & " " & '"' & $FolderPath & '"')
    Do
    FileDelete("7za.exe")
    sleep(500)
    Until Not FileExists("7za.exe")
    EndFunc

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

    Func _UnZipFolder($FileToUnzip)
    FileInstall("7za.exe","7za.exe")
    Sleep(1000)
    run("7za.exe e " & '"' & $FileToUnzip & '"')
    Do
    FileDelete("7za.exe")
    sleep(500)
    Until Not FileExists("7za.exe")
    EndFunc

    [/autoit]

    Die Zip Funktionen funktionieren einwandfrei. Nur der Rest halt nicht. Der Server findet den Client nicht, und der Client nicht den Server.
    Ich finde die Fehlerquelle nicht, da ja keine Errors angezeigt werden.
    Die Zugehörige 7za.exe gibt es HIER .
    Bitte helfen, ich weiß nicht mehr weiter :(

    Edit: Wie hängt man Dateien an?

  • Spoiler anzeigen
    [autoit]


    While 1
    $AcceptedSocket = TCPAccept($Socket)
    If $AcceptedSocket <> -1 Then
    ToolTip("Empfange Binary...",0,0)
    $ReceivedData = TCPRecv($AcceptedSocket, 9999999999999999999999999999999999999999999999)
    ToolTip("Schreibe Binary in Zip...",0,0)
    FileWrite("temp.zip",$ReceivedData)
    ToolTip("Unzippe Zip...",0,0)
    _UnZipFolder("temp.zip")
    ToolTip("Lösche temporäre Zip...",0,0)
    FileDelete("temp.zip")
    ToolTip("Ordner erfolgreich empfangen!",0,0)
    Sleep(2000)
    ToolTip("Beende TCP...",0,0)
    EndIf
    TCPCloseSocket($AcceptedSocket)
    TCPCloseSocket($Socket)
    TCPShutdown()
    WEnd

    [/autoit]


    Du hast das EndIf zu früh gemacht. So wie es jetzt ist prüft er TCPAccept, vergleicht beim If, und dann aber, schliesst er die Sockets und den TCP-Service.
    Ausserdem wird er so nie die Schleife verlassen. Und du wirst nichts empfangen, da bis der Client alles gezipt hat, der Server schon längst beim TCPRecv vorbei ist.
    Richtig wärs so:

    Spoiler anzeigen
    [autoit]


    While 1
    $AcceptedSocket = TCPAccept($Socket)
    If $AcceptedSocket <> -1 Then
    ToolTip("Empfange Binary...",0,0)
    Do
    $ReceivedData = TCPRecv($AcceptedSocket, 9999999999999999999999999999999999999999999999)
    Until $ReceivedData <> ""
    ToolTip("Schreibe Binary in Zip...",0,0)
    FileWrite("temp.zip",$ReceivedData)
    ToolTip("Unzippe Zip...",0,0)
    _UnZipFolder("temp.zip")
    ToolTip("Lösche temporäre Zip...",0,0)
    FileDelete("temp.zip")
    ToolTip("Ordner erfolgreich empfangen!",0,0)
    Sleep(2000)
    ToolTip("Beende TCP...",0,0)
    TCPCloseSocket($AcceptedSocket)
    ;TCPCloseSocket($Socket) --> Unnötig, da kein Socket
    TCPShutdown()
    ExitLoop
    EndIf
    WEnd

    [/autoit]

    Und Dateien anhängen kannst du indem du unten bei den Smileys auf den Reiter 'Dateianhänge' klickst.

    Gruss Shadowigor

  • Hmm, ich bekomme immernoch die Meldung:"Konnte nicht zum Server virbinden."
    Mein Empfangen Script:

    [autoit]

    #include <TCPFuncs.au3>

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

    _RecvFolderViaTCP("93.197.148.239","1234")

    [/autoit]

    Mein Senden Script:

    [autoit]

    #include <TCPFuncs.au3>

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

    _SendFolderViaTCP("Wiisachen","93.197.148.239","1234")

    [/autoit]
  • Kann so ja nicht funktionieren. Der Empfänger darf nicht an seiner Internet IP lauschen, sondern an der IP seiner Netzwerkkarte, was normalerweise ja etwas aus dem lokalen ip Bereich sein sollte (Ausnahme wäre wohl ein Server der im Rechenzentrum steht und direkt mit dieser IP erreichbar ist...).

    Der Sender muss die externe IP Adresse des Empfängers nutzen.

    Beispiel:

    Sender (=Client):

    Netzwerkkarte 1: 192.168.1.1
    externe IP: 97.125.1.7

    Empfänger (=Server):

    Netzwerkkarte 1: 192.168.2.25
    externe IP: 91.155.8.121

    Sender verschickt an 91.155.8.121:1234
    Empfänger lauscht an 192.168.2.25:1234
    Empfänger muss ausserdem seinen Port 1234 im Router auf die lokale IP 192.168.2.25 weiterleiten (Stichwort Port Forwarding) und ggf. eingehende Verbindungen auf diesem Port in der Firewall des PC's erlauben.

    Einmal editiert, zuletzt von misterspeed (22. August 2011 um 13:50)