10 'Simple FTP client 20 'Developed 08 Jan 2016 by Eugeny Brychkov 30 CLEAR2048:MAXFILES=3 40 INPUT"FTP server";S$:IFS$<>""THENCALLNETSETHOST(S$) 50 CALLNETSETPORT(21):PRINT"Connecting to FTP server..."; 60 OPEN"TCPA:"AS#1:PRINT"success":'open control connection 70 LINEINPUT#1,M$:PRINTM$:'Initial FTP server message 80 LINEINPUT Q$:PRINT#1,Q$:'command for FTP server 90 LINEINPUT#1,R$:'response from FTP server 100 PRINTR$ 110 I=1:GOSUB440:'get FTP code at the beginning of response string 120 IFN<>227THEN180:'not a response for PASV command 130 PRINT"* Streaming from ";:L=LEN(R$):FORI=1TOL:IFMID$(R$,I,1)<>"("THENNEXTI:PRINT"Parse error":STOP 140 I=I+1:GOSUB440:A=N:GOSUB440:B=N:GOSUB440:C=N:GOSUB440:D=N:GOSUB440:P1=N:GOSUB440:P0=N 150 CALLNETSETHOST(A,B,C,D):PO=P1*256+P0:CALLNETSETPORT(PO) 160 PRINTHEX$(A);".";HEX$(B);".";HEX$(C);".";HEX$(D);"/";HEX$(PO);" *" 170 OPEN"TCPB:"AS#2:GOTO 380 180 IFN<>150THEN380:'not a data exchange response 190 CO$="":FORI=1TO4:A$=MID$(Q$,I,1):A=ASC(A$):IFA=32THEN210ELSEIFA>96ANDA<123THENA=(A AND &HDF) 200 CO$=CO$+CHR$(A):NEXTI 210 PRINT"* Command: [";CO$;"] *":IFCO$="LIST"THEN350ELSEIFCO$<>"RETR"ANDCO$<>"STOR"THENPRINT"* Illegal command *":STOP 220 FM$="":L=LEN(Q$):FORI=LTO1STEP-1:A$=MID$(Q$,I,1):IFA$<>" "ANDA$<>"\"ANDA$<>"/"THENFM$=A$+FM$:NEXTI 230 IFCO$="STOR"THEN400;'otherwise it is RETR 240 'RETR command: get file from remote server 250 PRINT"* Performing data download [";FM$;"] *" 260 L=LEN(FM$):FK$="":FORI=1TO9:C$=MID$(FM$,I,1):FK$=FK$+C$:IFC$<>"."THENNEXTI 270 EX$="":FORJ=LTO1STEP-1:C$=MID$(FM$,J,1):IFC$="."THENEX$=MID$(FM$,J,4)ELSENEXTJ 280 FM$=LEFT$(FK$,LEN(FK$)-1)+EX$ 290 PRINT"* Target is [";FM$;"] *":OPENFM$AS#3LEN=1:FIELD#3,1ASFO$ 300 ON ERROR GOTO 470 310 IF EOF(2) THEN CLOSE#3:CLOSE#2:ON ERROR GOTO 0:PRINT"* Download finished *":LINEINPUT#1,M$:PRINTM$:GOTO80 320 A$=INPUT$(1,2) 330 LSETFO$=A$:PUT#3:GOTO 310 340 'LIST command: file listing to the screen 350 PRINT"* File list *" 360 IF EOF(2) THEN CLOSE#2:LINEINPUT#1,M$:PRINTM$:GOTO 80 370 LINEINPUT#2,A$:PRINTA$:GOTO360 380 IFN<>221 THENGOTO 80 ELSE PRINT"* FTP session finished *":CLOSE#1:END 390 'STOR command 400 PRINT"* Performing data upload [";FM$;"] *":OPENFM$AS#3LEN=1:FIELD#3,1ASFO$ 410 FS=LOF(3):FORI=1TOFS:IF EOF(2) THEN CLOSE#3:CLOSE#2:PRINT"Communication error":GOTO80 420 GET#3:PRINT#2,FO$;:NEXTI:CLOSE#3:CLOSE#2:PRINT"* Completed *":LINEINPUT#1,M$:PRINTM$:GOTO80 430 'get number from the list; I=position in string; R$ as string 440 N$="":FORJ=0TO2:C$=MID$(R$,I,1):R=ASC(C$):IFR>&H2F AND R<&H3A THEN N$=N$+C$:I=I+1:NEXTJ 450 N=VAL(N$):I=I+1:RETURN 460 'EOF char error handling 470 IF ERL=320 AND ERR=55 THEN A$=CHR$(&H1A):RESUME NEXT ELSE PRINT"Error";ERR;"in";ERL:END 480 'find substring TS$ in T$, return TO non-zero if found 490 TO=0:TR=LEN(TS$):TL=LEN(T$)-TR+1:IFTL<=0THENRETURN 500 FORTC=1TOTL:IFMID$(T$,TC,TR)=TS$THENTO=1:RETURNELSENEXTTC:RETURN