FTP Proxy

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

FTP Proxy

Beitrag von uweb »

Eigentlich sollte es doch nicht so schwer sein einen ganz einfachen FTP-Proxy zu schreiben - dachte ich.
Im ersten Schritt will ich einfach nur die Kommunikation auf dem Control Channel durchreichen.
Aktiv- bzw Passiv-Mode spielt dabei ja keine Rolle und die Buffergröße ist auch unkritisch.
Client, Proxy und Server laufen auf dem gleichen Rechner. Die Firewall kann auch nicht schuld sein, denn bis zur Passwortabfrage läuft es ja.
Ohne Proxy kommen Client und Server auch prima miteinander aus.
Ich bin mir fast sicher, dass es ein ganz blöder Fehler ist, den ich aber nicht sehe.

Code: Alles auswählen

EnableExplicit

Define ServerName.s = "127.0.0.1" ; for example FileZilla Server
Define PortToServer = 2121

Define OwnPort = 21
Define *Buffer = AllocateMemory(10000)

Define ClientID, ServerID
Define WEvent, SEvent, CEvent, Quit
Define Size, sent
Define temp.s, temp2.s


Macro DebugBuffer
  temp="" 
  temp2="" 
  For i = 0 To Size
    temp = temp.s + Str(Asc(PeekS(*Buffer+i,1)))+" "
    temp2 = temp2.s + Chr(Asc(PeekS(*Buffer+i,1)))+" "
  Next 
  Debug ""
  Debug temp 
  Debug temp2 
  Debug "----------"  
EndMacro


If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0) : End
EndIf

If CreateNetworkServer(0, OwnPort)
  OpenWindow(0, 800, 50, 230, 30, "Atomic FTP Proxy Server (Port "+Str(OwnPort)+")")
  StickyWindow(0, #True) 
  TextGadget(1, 10, 8, 200, 20, "Atomic FTP Proxy Server Ready.")
  
  Repeat
    WEvent = WindowEvent()
    SEvent = NetworkServerEvent()
    
    If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
    
    If SEvent : ClientID = EventClient()
      
      Select SEvent
          
        Case #PB_NetworkEvent_Connect
          Debug "#PB_NetworkEvent_Connect" : Debug "----------" 
          SetGadgetText(1, "Client connected !")
          ServerID = OpenNetworkConnection(ServerName, PortToServer)
          If ServerID
            FillMemory(*Buffer, 10000) 
            Size = ReceiveNetworkData(ServerID , *Buffer, 10000) 
            
              ;If Size > 3 : PokeL(*Buffer+Size-2, 0) : EndIf
              ;Size-2
              ;DebugBuffer
            
            If Size <> -1
              Debug "< "+PeekS(*Buffer, Size) : Debug "----------"  
              sent=0
              Repeat
                sent = sent+SendNetworkData(ClientID, *Buffer, 10000)
              Until Size = sent
              Debug "<< "+PeekS(*Buffer, sent) : Debug "----------" 
            Else
              MessageRequester("Error from #PB_NetworkEvent_Connect", "ReceiveNetworkData(ServerID , *Buffer, 10000)", 0)
            EndIf
            
          Else
            MessageRequester("Error from #PB_NetworkEvent_Connect", "OpenNetworkConnection(ServerName, PortToServer)", 0)
          EndIf
          
          
        Case #PB_NetworkEvent_Disconnect
          Debug "#PB_NetworkEvent_Disconnect from Client"
          SetGadgetText(1, "Client disconnected !")
          CloseNetworkConnection(ServerID)
          ServerID=0
          
          
        Default
          Debug "Default" : Debug "----------" 
          FillMemory(*Buffer, 10000) 
          Size = ReceiveNetworkData(ClientID , *Buffer, 10000) 
          SetGadgetText(1, "Client has send data !")
          If Size <> -1
            Debug "> "+PeekS(*Buffer, Size) : Debug "----------" 
            sent=0
            Repeat
              sent = sent+SendNetworkData(ServerID, *Buffer, Size)
            Until Size = sent
            Debug ">> "+PeekS(*Buffer, sent) : Debug "----------" 
          Else
            MessageRequester("Error from Default", "ReceiveNetworkData(ClientID , *Buffer, 10000) ", 0)
          EndIf
          
          Repeat : CEvent = NetworkClientEvent(ServerID) : Debug "." : Delay (1) : Until CEvent
          
          Select  CEvent
            Case #PB_NetworkEvent_Data
              Debug "..."
              FillMemory(*Buffer, 10000) 
              Size = ReceiveNetworkData(ServerID , *Buffer, 10000) 
              
              ;If Size > 3 : PokeL(*Buffer+Size-2, 0) : EndIf
              ;Size-2
              ;DebugBuffer
              
              If Size <> -1
                Debug "< "+PeekS(*Buffer, Size) : Debug "----------" 
                sent=0
                ;Repeat ;-
                  sent = sent+SendNetworkData(ClientID, *Buffer, Size)
                ;Until Size = sent
                Debug "<< "+PeekS(*Buffer, sent) : Debug "----------" 
                SetGadgetText(1, "Client has received data !")
                
              Else
                MessageRequester("Error from Default", "ReceiveNetworkData(ServerID , *Buffer, 10000)", 0)
              EndIf
              
            Case #PB_NetworkEvent_Disconnect
              Debug "#PB_NetworkEvent_Disconnect from Server"
              
          EndSelect ; CEvent = NetworkClientEvent(ServerID)
          
      EndSelect ; SEvent = NetworkServerEvent()
      
    Else
      Delay(10)
    EndIf
    
  Until Quit = 1 
  
  If ServerID : CloseNetworkServer(0) : EndIf
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End 
#PB_NetworkEvent_Connect
----------
< 220-FileZilla Server 0.9.56 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/

----------
<< 220-FileZilla Server 0.9.56 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/

----------
Default
----------
> USER uwe

----------
>> USER uwe

----------
.
.
...
< 331 Password required for uwe

----------
<< 331 Password required for uwe

----------
#PB_NetworkEvent_Disconnect from Client
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: FTP Proxy

Beitrag von Bisonte »

Liegt es evt. an Unicode Kompilat ? Ich meine mich zu erinnern, dass FileZilla allergisch auf nicht-ASCII Zeichen reagiert...
Weil ich sehe bei dem Code keinerlei Umwandlung für diesen Fall.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: FTP Proxy

Beitrag von uweb »

Danke für die schnelle Antwort.
Aber nein, das habe ich auch schon geprüft.

Mit Unicode sieht bei mir die Debugausgabe auch übel aus, da Client und Server ja (noch) in ASCII arbeiten.
Obwohl, ich glaube irgendwo gelesen zu haben, dass Server nach neuerem Standard auch mit Clients klar kommen sollen die von Anfang an nur Unicode sprechen.
Antworten