In response to the FEAT request, some servers just return "PROT" and the current test for PROT P will always fail. This is the minor change I have made to the FTP Client. It would be nice if this could be added so I don't have to modify the source after each update:

Change this:

                if Pos('PROT', Feat) = 1 then begin
                    if Feat = 'PROT' then
                        FSupportedExtensions := FSupportedExtensions + [ftpFeatProt];
                    if Pos('C', Feat) > 5 then
                        FSupportedExtensions := FSupportedExtensions + [ftpFeatProtC];
                    if (Pos('P', Feat) > 5) then
                        FSupportedExtensions := FSupportedExtensions + [ftpFeatProtP];

to this:

Define tempFeat at start of ControlSocketDataAvailable
Add ftpFeatProt to TFtpExtension

                if Pos('PROT', Feat) = 1 then
                  tempFeat := Feat;
                  Delete (tempFeat, 1, 4); //Just leave any parameters

                  if Length (tempFeat) = 0 then //It was just "PROT"
                    FSupportedExtensions := FSupportedExtensions + [ftpFeatProt];
                    if Pos('C', tempFeat) > 0 then
                      FSupportedExtensions := FSupportedExtensions + [ftpFeatProtC];

                    if Pos('P', tempFeat) > 0 then
                      FSupportedExtensions := FSupportedExtensions + [ftpFeatProtP];


On 11/02/2018 21:16, Graham Powell wrote:
Thank you once again for your help. You are indeed correct. A search on the Internet suggests the timeout could be between 30 and 120 seconds.

When I have finished all my testing, I show you what I have modified in the SslFtpClient. Just a simple change to the processing of the FEAT response regarding PROT. Some servers just return PROT and the current detection of PROT P will always fail.


On 11/02/2018 14:40, Angus Robertson - Magenta Systems Ltd wrote:
I have set Active Mode and the Data Port Range to 10000..10010
I connect to the Demo Server and click on the "Get" button.
I have a breakpoint where the Data Port number is allocated so I
can see it increment through the above range.
When it gets to 10010 it loops back to 10000.
The next click on the "Get" button fails with the error that this
port (10000) is in use.
This is standard windows behaviour, established ports do not close
instantly you close a connection, they go into time_wait state for
about 60 seconds in case packets are still floating around.

So you probably clicked past your range of 10 in one minute or so.
Just make the range 100 or 1,000.

Finding some users ports (1,024 up) in use is inevitable because so
many applications use them for internal purposes, so you need to always
retry failed connection, repeatedly.  Also better to choose an obscure
range that others are less likely to be using than around 10,000.

Which is exactly why many people use my TMagFtp component, all this
stuff is long known and handled.

To unsubscribe or change your settings for TWSocket mailing list
please goto
Visit our website at

Reply via email to