Port eines ankommenden Pakets herausfinden

  • Unswar würde ich gern wissen , wie ich den Port eines ankommenden Pakets bekommen kann.
    Ich habe eine Anwendung die Lokal ein Paket auf Port 86 schickt , jedoch über einen zufälligen Ausgangsport zwischen 50000 und 60000

    Um der Anwendung zu antworten brauche ich also den Port über den das Packet gesendet wurde.
    Wie kann ich das herausfinden ?(


    Beide Anwendungen laufen Lokal und senden an 127.0.0.1

  • Wenn ich das wäre müsste ich nicht fragen :D

    Wiegesagt als Ausgangsport wird ein zufälliger gewählt und diesen muss ich herausfinden

    oder wie meinste das ?
    Denn Verbindung besteht zwar , aber der Client antwortet nicht auf das Server Paket , obwohl es gesendert wurde

    [autoit]

    $sendconnect = TCPConnect($local,60000)
    $send = TCPSend($sendconnect,"Test")

    [/autoit]

    Und ich denke es liegt an dem Port bei TCPConnect

  • Das geht so nicht... Du versuchst hier das TCP zu misbrauchen ^^.
    Wenn dann müsste der Server alle auswählbaren Ports offen haben und dort auch lauschen. Wenn du also zwischen 500 möglichen Ports wählen willst, dann musst du auch 500 Sockets erstellen für jeden einen.
    Das ist nicht nur bei AutoIt so. So ist das TCP gedacht und so wird es auch verwendet.

  • Zitat

    Also soll ich den Server mit x Anfragen zuballern und warten über was ne Antwort komt ? :D


    Nö. Du sollst uns sagen wieso du zufällig einen Port aussuchen willst. Dann finden wir gemeinsam eine Alternative.
    Denn dein Vorhaben ist im Moment ein bisschen Schwachsinnig, besonders mit so vielen Ports...

  • Nun, wie es mir scheint, hast du TCP noch nicht ganz verstanden. Nur der Client benutzt TCPConnect. Beim Server bekommst du das Socket für TCPSend von TCPAccept zurück. Sonst schaust du dir am besten noch ein paar Tutorials zu dem Thema an.

    Gruss Shadowigor

  • Gut versuch ichs mal genauer zu erklären vielleicht hilfts ja :D

    Also ich hab ein Programm was über einen zufälligen Port an den Port 86 sendet.
    Port 86 abhören funkioniert auch.
    Nun will ich dem Programm antworten aber wie mach ich das?
    Der zufällige Port ist nicht beeinflußbar

    [autoit]

    ;~ ########## verbindung zulassen
    $listen = TCPListen("127.0.0.1",86)
    Do
    $connected = TCPAccept($listen)
    Until $connected <> - 1
    Do
    $recv = TCPRecv($connected,48,1)
    Until Not $recv = ""
    FileWrite("log1.txt",$recv)

    [/autoit]

    Damit wird die erste nachricht empfangen -> Klappt auch

    Und auf diese Nachricht soll geantwortet werden

    [autoit]

    $send = TCPSend($connected,"Test")
    If $send = 0 Then
    ConsoleWrite("Verbindungsfehler : " & @error)
    Sleep(5000)
    Exit
    EndIf
    ToolTip("SENDED")

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

    Do
    $recv = TCPRecv($connected,4096,1)
    Until Not $recv = ""
    FileWrite("log3.txt",$recv)

    [/autoit]

    Allerdings kommts bis zu "Sended" aber empfängt folgende Nachricht nicht , was meiner Meinung nach am falschen Port liegt

    Einmal editiert, zuletzt von Aldi (17. August 2012 um 23:06)

  • Ja dieses Problem hatte ich auch schon einmal, aber nicht bei TCP sondern beim UDP protokoll.

    Auch hier hatte ich vor eine anfrage an ein Gerät zu senden und auf die Antwort zu warten, diese kam aber nicht auf dem selben Port zurück wie die Anfrage. Also habe ich mir folgendes gebastelt.

    Vieleicht kannst du das ja auch auf das TCP protokoll anwenden.

    hier mein sinpplet (hier habe ich nach einem gerät gesucht und die anfrage über port 10011 gesendet und den port abgefangen.: (hoffe du steigst da durch :)

    Spoiler anzeigen
    [autoit]

    UDPStartup()
    $socket = UDPOpen("255.255.255.255", 10011, 1)
    If @error Then
    SetError(1)
    ;~ MsgBox(-1, "", "error udpopen")
    Exit
    EndIf
    #endregion Broadcast IP erstellen und Port öffnen zu dem gesendet werden soll.

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

    broadcastsend($socket, ".") ; irgentetwas senden um einen Port zu aktivieren

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

    #region Port auslesen von dem aus gesendet wurde
    $ausgabe = _getDOSOutput("netstat -aonp udp")
    $ausgabe = StringStripWS($ausgabe, 8)
    $ausgabe = StringTrimRight($ausgabe, StringLen($ausgabe) - StringInStr($ausgabe, "*:*" & @AutoItPID) - 6)
    $ausgabe = StringTrimLeft($ausgabe, StringInStr($ausgabe, "*:*" & @AutoItPID) - 25)
    $zwischenwert = _StringBetween($ausgabe, "0.0.0.0:", "*:*" & @AutoItPID)
    Global $port = _ArrayUnique($zwischenwert)

    [/autoit]

    hier noch die passenden funktionen aus dem snipplet:

    Spoiler anzeigen
    [autoit]

    Func broadcastsend($sSocket, $sSendewert)
    UDPSend($sSocket, $sSendewert & @CRLF)
    If @error Then
    MsgBox(-1, "", "error send")
    EndIf
    EndFunc ;==>broadcastsend

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

    Func _getDOSOutput($command)
    Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2)
    While 1
    $text &= StdoutRead($Pid, False, False)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $text
    EndFunc ;==>_getDOSOutput

    [/autoit]

    hintergrund gedanke war nun das wenn ich einmal was gesendet habe der port sich nicht mehr ändert. was auch zumindest bei meinem gerät zum erfolg führte.

    Gruß
    Pre

  • Wieso sagst du das nicht gleich so :rolleyes: ...
    Wozu brauchst du da den Port? Den kannst du unmöglich wissen und damit kannst du auch nichts anfangen...
    Du sendest Informationen zurück über den Socket der von TCPAccept zurückgegeben wurde. Da brauchst du keinen Port für :rolleyes: ...
    TCP ist ein Vollduplex Protokoll. Es kann Informationen in beide Richtungen auf einer Verbindung übertragen.

  • Danke werde mich morgen mal daran probieren :P

    Also bei mir ists so das das Programm sich zu Anfang einen Port nimmt.
    Dann beginnt es in 4 "Phasen" zu antworten

    Die erste Phase ist halt der zufällige Port , die zweite Phase der Port +1 usw.
    Also nur die schwieirigkeit den ersten Port zu finden :p

    @Name
    Wiegesagt normalerweise sollte auf mein TCPSend eine Reaktion vom Server (auf Port 86) kommen , jedoch kommt eben nichts :D
    Und da liegt mein Problem ^^

  • Zitat

    Wiegesagt normalerweise sollte auf mein TCPSend eine Reaktion vom Server (auf Port 86) kommen , jedoch kommt eben nichts :D
    Und da liegt mein Problem ^^


    Aha... Hat bis jetzt in all den Jahren bei mir problemlos funktioniert...
    Wie empfängst du denn die Daten?

  • Der Port ist für eine Verbindung fest. Eventuell schaltet der Server einen zweiten, zufälligen Port frei, sendet die Nummer an den Client und der Client verbindet dann auf den neuen Port mit einer neuen Verbindung. Anschließend kannst du die Ports einfach vergessen.

  • [autoit]

    $listen = TCPListen("127.0.0.1",86)
    Do
    $connected = TCPAccept($listen)
    Until $connected <> - 1
    Do
    $recv = TCPRecv($connected,48,1)
    Until Not $recv = ""

    [/autoit]


    Hier wird alles auf Port 86 empfangen aber kommt eben nix außer das eine Packet am Anfang :P

    @progandy
    Also bei mir ists so das das Programm sich zu Anfang einen Port nimmt.
    Dann beginnt es in 4 "Phasen" zu antworten

    Die erste Phase ist halt der zufällige Port , die zweite Phase der Port +1 usw.

  • ...
    Du verwendest TCPConnect um dich mit dem Server zu vebinden. Und dann versuchst du eine eingehende Verbindung anzunehmen wo nie eine ankommen wird? 8|
    Wozu!?
    TCPConnect gibt bei erfolgreicher Verbindung ein Socket zurück über das du Daten empfangen UND senden kannst....