FTP Proxy
Verfasst: 08.05.2016 22:59
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.
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