PORT befehl bei FTP

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

PORT befehl bei FTP

Beitrag von zigapeda »

Hallo

Ich weiß ich habs gerade mit den Protokollen^^

Kann mir jemand den PORT befehl erklären?
Ich weiß es müssen 6 zahlen übergeben werden
die 1. vier zahlen sind die IP adresse
aber was ist die 5. und die 6. zahl?
und was hat das alles mit dem port zu tun?

Und noch eine Frage: was soll cih für die 5. und die 6. Zahl einsetzen? ich hab bei LeechFTP beobachtet das es als 5. zahl 17 hat und als 6. zahl irgendwas mit 100. dann hab ich ein paar mal das verzeichnis aktuallisiert, solange bis die 6. zahl auf 255 war und danach wieder 0 wurde und dafür die 5. zahl um eins höher. Teilweiße wurden auch ein paar zahlen übersprungen.
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

5 und 6 Zahl ist der Port. Frag mich jetzt aber nicht wie diese zusammen
gesetzt werden soll. Vielleicht High und Low Byte. Oder Multiplikation.
Vielleicht auch Addition. Habe da leider keine genaue Ahnung. Einfach
mal mit Try&Error versuchen :mrgreen:
Bild
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

aso...

also wenn das so ist dann schätze ich mal ist die 5. zahl auch bis 255 und geht dann wieder von 0 los.
d.h. die beiden zahlen variieren zwischen 0 und 255 d.h. 256 möglichkeiten.
http://www.google.de/search?q=256*256
Das wäre dann genau die anzahl an ports die es gibt.

aber jetzt noch zu meiner zweiten frage, wie wird der port gewählt?
Ich hab eine FTP Protokollerklärung gelesen und da stand drin das der port 21 zum komunizieren ist und der port 20 zum daten übertragen.
gibt es da jetzt noch einen dritten port oder was?

Dann nochmal eine frage: wenn ich jetzt vom server die antwort bekomme das der portbefehl funktioniert hat und das ich PASV benutzen soll was mach ich dann? Ich hab in dem Protokoll von LeechFTP nachgeschaut und der macht dann nix bzw. protokolliert nix. muss ich dann schon das PASV nutzen oder wie ist das?

[Edit]warum funktionieren die URL tags nicht? :? [/Edit]
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Eigentlich ist der Port 20 für die Datenübertragung vorgesehen aber
Heute hält sich kein Server mehr daran ;). Das liegt daran, dass die
Server alle jetzt mehr als einen Port verwalten können. Der Port wird
dann per Zufallsprinzip gesucht und wenn er frei ist gleich reserviert.

Zum PASV fragste mich jetzt was. Ich habe da leider nicht mehr genau
ne Idee was das war. Irgendwas mit Passiv ist mir klar :mrgreen:.
Als ich das letzte mal ein FTP Clienten geproggt habe, der auch wirklich
funktionieren sollte war das villt mit 12-13 Jahren und VB :?.

Was ich dir aber empfehlen kann, ist Wikipedia. In jeder Hinsicht zu jeder
Zeit zu jedem Zweck brauchbar :mrgreen::
http://de.wikipedia.org/wiki/File_Transfer_Protocol
Bild
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

also wenn er was von PASV sagt dann muss ich das machen oder?

Ich bin mir nicht sicher weil mein FTP client protokolliert alles was er macht aber von dem befehl PASV ist nichts zu sehen.
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Kannste die Prozeduren mal umschreiben(dies ist die Clientseite):

Code: Alles auswählen

Procedure.s PassiveIP(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
  ProcedureReturn IP.s
EndProcedure

Procedure.l PassivePort(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
  ProcedureReturn Port
EndProcedure
Beim PASV Befehl wird nämlich dieser 6 Stellige Code(Beispiel siehe unten) zurückgegeben, damit der Client weiß wohin er connecten soll.
PASV Rückmeldung hat geschrieben:227 Entering Passive Mode (217,13,197,212,15,62)
Beispielanwendung meiner Prozeduren:

Code: Alles auswählen

Procedure.s PassiveIP(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
  ProcedureReturn IP.s
EndProcedure

Procedure.l PassivePort(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
  ProcedureReturn Port
EndProcedure

Text.s = "227 Entering Passive Mode (217,13,197,212,15,62)"
Debug PassiveIP(Text.s)
Debug PassivePort(Text.s)
Das ganze kann man glaube ich auch bei Wikipedia nachlesen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

das heißt der port ist folgender:

Code: Alles auswählen

zahl5 * 256 + zahl6
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

zigapeda hat geschrieben:das heißt der port ist folgender:

Code: Alles auswählen

zahl5 * 256 + zahl6
Ja
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

mal eine frage:
was muss ich genau tun (bzw. senden) nach dem upload einer datei?
ich lade jetzt eine datei hoch und dann ist sie mit meiner IP und dem PORT den ich verwendet hab auf dem server.
-wie geht das umbenennen
-wie geht das format festlegen also wenn es eine JPG ist oder so oder ist das bereits teil des umbenennen?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Eventuell kannst du es ja gebrauchen:

Code: Alles auswählen

Global EOL.s
EOL.s = Chr(13)+Chr(10)

Procedure.s PassiveIP(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
  ProcedureReturn IP.s
EndProcedure

Procedure.l PassivePort(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
  ProcedureReturn Port
EndProcedure

Procedure.s Wait(ConnectionID, Timeout)
  Delay(10)
  *Buffer = AllocateMemory(60000)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
  If ElapsedMilliseconds()-t < Timeout
  Size = ReceiveNetworkData(ConnectionID, *Buffer, 60000)
  Text.s = PeekS(*Buffer)
  FreeMemory(*Buffer)
  ProcedureReturn Text
  EndIf
EndProcedure

Procedure Wait2(ConnectionID, *Buffer, Size, Timeout)
  Delay(50)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) = 0 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
  If ElapsedMilliseconds()-t < Timeout
  CurSize = ReceiveNetworkData(ConnectionID, *Buffer, Size)
  While CurSize < Size
    If NetworkClientEvent(ConnectionID) = 2
    CurSize + ReceiveNetworkData(ConnectionID, *Buffer+CurSize, Size-CurSize)
    EndIf
  Wend
  ProcedureReturn CurSize-1
  EndIf
EndProcedure

Procedure SendNetworkString2(ConnectionID, String.s)
  SendNetworkString(ConnectionID, String.s)
EndProcedure

Procedure FTP_Connect(Server.s, Port, Name.s, Pass.s)
  ConnectionID = OpenNetworkConnection(Server, Port)
  If ConnectionID
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "220"
      SendNetworkString2(ConnectionID, "USER "+Name.s+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "331"
        SendNetworkString2(ConnectionID, "PASS "+Pass.s+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "230"
          SendNetworkString2(ConnectionID, "TYPE A"+EOL)
          Wait(ConnectionID, 5000)
          ProcedureReturn ConnectionID
        EndIf
      EndIf
    EndIf
    CloseNetworkConnection(ConnectionID)
  EndIf
EndProcedure

Procedure FTP_SetCurrentDirectory(ConnectionID, Path.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CWD "+Path.s+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      SendNetworkString2(ConnectionID, "PWD"+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "257"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_List(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "LIST"+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 5000)
          Delay(10)
          Result.s = Wait(Passive, 5000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      Else
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_NameList(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    Debug "PASV Rückmeldung: "+Text
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "NLST"+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 5000)
          Delay(100)
          Result.s = Wait(Passive, 5000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_DownloadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "RETR "+SFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        s = FindString(Text, "(", 1)+1
        l = FindString(Text, " ", s)-s
        Size = Val(Mid(Text, s, l))
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(1024)
          Text = ""
          s = 0
          If CreateFile(0, DFile)
            While s < Size
              Size2 = ReceiveNetworkData(Passive, *Buffer, 1024)
              If Size2 > 0
                s + Size2
                WriteData(*Buffer, Size2)
              EndIf
            Wend
            CloseFile(0)
          EndIf
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_UploadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "STOR "+DFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(FileSize(SFile))
          If ReadFile(0, SFile)
            ReadData(*Buffer, FileSize(SFile))
            CloseFile(0)
          EndIf
          SendNetworkData(Passive, *Buffer, FileSize(SFile))
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_DeleteDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RMD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_RenameFile(ConnectionID, FromName.s, ToName.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RNFR "+FromName+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "350"
      SendNetworkString2(ConnectionID, "RNTO "+ToName+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "250"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_DeleteFile(ConnectionID, File.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "DELE "+File+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_CreateDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "MKD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "257"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_DirectoryUp(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CDUP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_NoEvent(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "NOOP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
  EndIf
EndProcedure

Procedure FTP_Quit(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "QUIT"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "221"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten