tcp problem :)

  • Hi Jungs!
    Ich hab versucht mich in letzter zeit etwas mit tcp zu beschäftigen, da ich entweder einen simplen server für daheim oder einen minichat basteln wollte:)
    um gleich mal die hauptfrage zu klären, JA der port 1337 ist in meinem router freigegen als TCP protokoll und JA meine firewall ist aus :)
    ich habe mir einige scripts angeschaut und letztendlich ein tutorial gefunden dass gleich mit dateisenden ging :) da es anfangs überhaupt nicht lief hab ich das senden von hexdaten auf normale daten umgeschreiben (nur testweise versteht sich) :)
    soweit hat es von meinem pc zu meinem pc gut geklappt halt mit @ipaddress1 :) als ich es dann aber umgeschrieben habe ging es nichtmehr! hier mein code :)

    [autoit]

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

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

    AutoIt Version: 3.3.0.0
    Author: Jiyan Akgül --> Bitte so lassen

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

    Moddet by : Dein Name <<-- Dein Name

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

    Script Function:

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

    <>--Data Send Server--<>

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

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

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

    ; Script Start -

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

    #cs
    Das müsst ihr dann in den script einbauan und anpassen
    #ce

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

    ;==== SERVER ====;

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

    #include <INet.au3>

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

    TCPStartup()

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

    Global $IP = @IPAddress1
    Global $PORT = 1337
    Global $MaxLen = 2048 ;Maximale Speed die benutzt werden darf (ACHTUNG: BENUTZT BEI ZU VIEL DIE GANZE LEITUNG)

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

    $MainSocket = TCPListen($IP, $PORT, 1)

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

    MsgBox(64, "INFO", "Es gibt folgende DreiSchritte:" & @CR & "1.Datei Auswählen" & @CR & "2.Verbindung zum Cient herstellen" & @CR & "3.Datei senden")

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

    $File = FileOpenDialog("Bitte wählen sie die Datei aus", @DesktopDir, "All (*.*)")

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

    Do
    $NewSocket = TCPAccept($MainSocket)
    Until $NewSocket >= 0
    TCPSend($NewSocket, "Datei")
    TCPSend($NewSocket, FileGetLongName($File))
    TCPSend($NewSocket, FileGetSize($File))
    Do
    $get = TCPRecv($NewSocket, $MaxLen)
    Until $get <> ""

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

    If $get = "OK" Then
    MsgBox(64,"INFO","Datei wurde von Gegenstelle angenommen")
    $handle = FileOpen($file,0)
    $File = FileRead($handle)
    TCPSend($NewSocket,$File)
    MsgBox(64,"INFO","Die Datei wurde gesendet")

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

    ElseIf $get = "NO" Then
    MsgBox(64,"INFO","Datei wurde von Gegenstelle angenommen")
    TCPCloseSocket($NewSocket)
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    EndIf

    [/autoit][autoit]

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

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

    AutoIt Version: 3.3.0.0
    Author: Jiyan Akgül --> Bitte so lassen

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

    Moddet by : Dein Name <<-- Dein Name

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

    Script Function:

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

    <>--Data Send Server--<>

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

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

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

    ; Script Start -

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

    #cs
    Das müsst ihr dann in den script einbauan und anpassen
    #ce

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

    ;==== CLIENT ====;
    #include<INET.au3>

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

    Global $IP = _GetIP()
    Global $Port = 1337
    Global $MaxLen = 2048

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

    TCPStartup()

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

    $Connect = MsgBox(0x21, "INFO", "Mit Server verbinden?")
    If $Connect = 2 Then
    TCPShutdown()
    Exit
    EndIf

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

    MsgBox(0x40, "INFO", "Verbinde nun mit Server")

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

    _connect()

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

    Func _connect()
    $MainSocket = TCPConnect($IP, $Port)
    If $MainSocket = -1 Then
    $Error = MsgBox(0x15,"ERROR","Konnte nicht mit Server verbinden."&@CR&"Bitte überprüfen Sie die Einstellungen."&@CR&"Noch einmal versuchen?")
    if $Error = 2 Then
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    ElseIf $Error = 4 Then
    TCPCloseSocket($MainSocket)
    _connect()
    EndIf
    EndIf
    Do
    $get = TCPRecv($MainSocket,$MaxLen)
    Until $get <> ""

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

    Do
    $FileName = TCPRecv($MainSocket,$MaxLen)
    Until $FileName <> ""
    Do
    $FileSize = TCPRecv($MainSocket,$MaxLen)
    Until $FileSize <> ""
    If $get = "DATEI" Then
    $yes_no = MsgBox(0x44,"INFO","Der Server möchte eine Datei senden."&@CR&"Name : "&$FileName&@CR&"Größe : "&$FileSize&@CR&"Annehmen?")
    if $yes_no = 6 Then
    TCPSend($MainSocket,"OK")
    $File = FileSaveDialog("Datei speichern als",@DesktopDir,"Alle (*.*)",2,$Filename)
    $open = FileOpen($File,1)
    Do
    $text = TCPRecv($MainSocket,$MaxLen)
    until $text <> ""
    FileWrite($open,$text)
    FileClose($open)
    MsgBox(0x40,"INFO","Datei wurde empfangen")
    ElseIf $yes_no = 7 Then
    TCPSend($MainSocket,"NO")
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    EndIf
    EndIf

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

    ; NICHT DAS THANKS VERGESSEN x)

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

    EndFunc ;==>_connect

    [/autoit]
  • So müsstes Funzen habbs aber nicht ausprobiert

    server :

    Spoiler anzeigen
    [autoit]


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

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

    AutoIt Version: 3.3.0.0
    Author: Jiyan Akgül --> Bitte so lassen

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

    Moddet by : Dein Name <<-- Dein Name

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

    Script Function:

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

    <>--Data Send Server--<>

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

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

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

    ; Script Start -

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

    #cs
    Das müsst ihr dann in den script einbauan und anpassen
    #ce

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

    ;==== SERVER ====;

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

    #include <INet.au3>

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

    TCPStartup()

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

    Global $IP = @IPAddress1
    Global $PORT = 1337
    Global $MaxLen = 2048 ;Maximale Speed die benutzt werden darf (ACHTUNG: BENUTZT BEI ZU VIEL DIE GANZE LEITUNG)

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

    $MainSocket = TCPListen($IP, $PORT, 1)

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

    MsgBox(64, "INFO", "Es gibt folgende DreiSchritte:" & @CR & "1.Datei Auswählen" & @CR & "2.Verbindung zum Cient herstellen" & @CR & "3.Datei senden")

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

    $File = FileOpenDialog("Bitte wählen sie die Datei aus", @DesktopDir, "All (*.*)")

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

    Do
    $NewSocket = TCPAccept($MainSocket)
    Until $NewSocket >= 0
    TCPSend($NewSocket, "Datei")
    TCPSend($NewSocket, FileGetLongName($File))
    TCPSend($NewSocket, FileGetSize($File))
    Do
    $get = TCPRecv($NewSocket, $MaxLen)
    Until $get <> ""

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

    If $get = "OK" Then
    MsgBox(64, "INFO", "Datei wurde von Gegenstelle angenommen")
    $handle = FileOpen($File, 16)
    While 1
    $File = FileRead($handle, 1024)
    If @error Then
    TCPSend($NewSocket, "EOF")
    ExitLoop
    EndIf
    TCPSend($NewSocket, $File)
    WEnd
    MsgBox(64, "INFO", "Die Datei wurde gesendet")

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

    ElseIf $get = "NO" Then
    MsgBox(64, "INFO", "Datei wurde von Gegenstelle nicht angenommen")
    TCPCloseSocket($NewSocket)
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    EndIf

    [/autoit]

    client

    Spoiler anzeigen
    [autoit]


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

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

    AutoIt Version: 3.3.0.0
    Author: Jiyan Akgül --> Bitte so lassen

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

    Moddet by : Dein Name <<-- Dein Name

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

    Script Function:

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

    <>--Data Send Server--<>

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

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

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

    ; Script Start -

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

    #cs
    Das müsst ihr dann in den script einbauan und anpassen
    #ce

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

    ;==== CLIENT ====;
    #include<INET.au3>

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

    Global $IP = _GetIP()
    Global $Port = 1337
    Global $MaxLen = 2048

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

    TCPStartup()

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

    $Connect = MsgBox(0x21, "INFO", "Mit Server verbinden?")
    If $Connect = 2 Then
    TCPShutdown()
    Exit
    EndIf

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

    MsgBox(0x40, "INFO", "Verbinde nun mit Server")

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

    _connect()

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

    Func _connect()
    $MainSocket = TCPConnect($IP, $Port)
    If $MainSocket = -1 Then
    $Error = MsgBox(0x15, "ERROR", "Konnte nicht mit Server verbinden." & @CR & "Bitte überprüfen Sie die Einstellungen." & @CR & "Noch einmal versuchen?")
    If $Error = 2 Then
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    ElseIf $Error = 4 Then
    TCPCloseSocket($MainSocket)
    _connect()
    EndIf
    EndIf
    Do
    $get = TCPRecv($MainSocket, $MaxLen)
    Until $get <> ""

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

    Do
    $FileName = TCPRecv($MainSocket, $MaxLen)
    Until $FileName <> ""
    Do
    $FileSize = TCPRecv($MainSocket, $MaxLen)
    Until $FileSize <> ""
    If $get = "DATEI" Then
    $yes_no = MsgBox(0x44, "INFO", "Der Server möchte eine Datei senden." & @CR & "Name : " & $FileName & @CR & "Größe : " & $FileSize & @CR & "Annehmen?")

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

    If $yes_no = 6 Then
    TCPSend($MainSocket, "OK")
    $File = FileSaveDialog("Datei speichern als", @DesktopDir, "Alle (*.*)", 2, $FileName)
    $open = FileOpen($File, 1)
    While 1
    $text = TCPRecv($MainSocket, 1024)
    If $text = "EOF" Then ExitLoop
    FileWrite($open, $text)
    WEnd
    FileClose($open)
    MsgBox(0x40, "INFO", "Datei wurde empfangen")
    ElseIf $yes_no = 7 Then
    TCPSend($MainSocket, "NO")
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit
    EndIf
    EndIf
    ; NICHT DAS THANKS VERGESSEN x)
    EndFunc ;==>_connect

    [/autoit]
  • danke für die antwort! doch soweit ich sehe hast du nur die eine errornachricht eingebaut oder? :o
    das allgemeine problem lag jedoch beim connecten auf den server )': ich weiß nicht warum, doch trotz tcp freigabe des ports funktioniert es nicht, muss ich hierzu noch eine portweiterleitung aufm einen pc einrichten?

    edit: also ich habe jetzt auch noch eine weiterleitung eingebaut und immernoch der selbe fehler, es kommt kein connection error, aber es kommt auch keine meldung dass es funktioniert :( woran liegt das, vllt daran dass ich es auf meinen eigenen pc verusche und der port somit 2 mal belegt ist?

    Einmal editiert, zuletzt von Mitch (30. Januar 2010 um 21:26)

  • wenn du daten übers internet übertragen willst muss der server auch den Socket auf der Öffentlichen IP Erstellen (ich hoffe du hast den Port weitergeleitet)

    also beim server

    [autoit]


    Global $IP = _GetIP()

    [/autoit]

    und beim Clienten

    [autoit]


    Global $IP = InputBox("Server IP","Bitte die IP vom Server eingeben","")

    [/autoit]
  • also beim Server reicht eigentlich @ipadress1 da brauchst du kein _GetIP()
    beim Clienten brauchst du das schon...soweit steht ja eigentlich auch alles richtig drinne

  • danke für die antworten! also ich habe imrouter eine portweiterleitung/umleitung auf meinen pc für den port 1337 eingerichtet UND habe ihn freigegeben :) leider gehts immernochnoch nicht

  • schau mal ob @ipaddress1 auch die selbe IP adresse ist, an welche du auch den port weitergeleitet hast

  • also ich hab nochmal nachgeschaut, alle settings waren richtig.
    dann habe ich das script nocheinmal komplett neu aufgesetzt und TADA es ging :)
    danke euch allen für die hilfe :D