Пишко Александр:Клиент делает listen на том ip и порту, на каких сможет и посылает команду port с такими ip и портом, какие будут видны со стороны сервера (в случае наличия файрволов между сервером и клиентом, они могут отличаться от тех, которые будут слушаться). В клиенте может быть предусмотрена возможность указать, какие порты слушать и что посылать в команде port, для прохождения файрволов.
Клиент поймет, что передача закончилась, когда получит
226 Transfer complete
К тому же сервер после окончания передачи списка закрывает соединение.
Если проверить с помощью telnet и netcat, то получается что последние 2 принятых байта: 0x00,0x0a, (для ProFTPD Version 1.3.1), то есть клиент может ждать нулевого байта.
Да и вообще это забота клиента
. Сервер должен после отправки последнего буфера, как только сокет станет вновь доступен для записи, послать
226 Transfer complete
по командному каналу и закрыть соединение по каналу данных.
Насчет 20 порта... мне не удалось поймать соединение на 20 порт, правда проверял на той же машине, где стоит сервер. В общем на практике клиент всегда посылает команду port, так как чтобы слушать 20 порт нужны права рута, которых как правило нет.