Как реализовать реакцию на команду EPSV (ALL) на моем FTP-сервере? - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь настроить FTP-сервер на Java в своей локальной сети через Wi-Fi.И я застрял с обработкой команды EPSV ALL.В качестве клиента я использую VLC player на iPhone.Он посылает EPSV ALL на сервер, когда я пытаюсь воспроизвести файл .mp4.Ответ сервера с этой строкой:

"229 Entering Extended Passive Mode (|||" + freeDataPort + "|)"

Сервер создает serverSocket на freeDataPort, прослушивает соединение о доходе и ничего не происходит.

Я пробовал открыть фильм с подключением к серверу FileZilla - все работает.Также я не могу понять, почему клиент пытается установить второе соединение (соединение, которое запрашивает пользователя и передает снова) после этой команды (EPSV), в то время как команда PASV создает соединение данных и выполняет простую передачу данных, как ответ на LIST, обработано в первом.

Это обработчик для EPSV, который я использую:

private void handleEpsv() {
    sendMsgToClient("229 Entering Extended Passive Mode (|||" + freeDataPort + "|)");
    try {
        dataSocket = new ServerSocket(freeDataPort);
        System.out.println("waiting for connect... port: " + freeDataPort);
        dataConnection = dataSocket.accept();
        dataOutWriter = new PrintWriter(dataConnection.getOutputStream(), true);
    } catch (IOException e)
    {
        debugOutput("Could not create data connection.");
        e.printStackTrace();
    }
}

То, что это привело в последний раз:

FTP Server started listening on port 21
{/192.168.0.105=INITIALThread-0    Threads in data list: 0}
New connection received. Worker was created.
from INITIAL THREAD
Thread-0 - send to client:    220 Welcome to the FTP-Server

USER a from INITIAL THREAD
Thread-0 - send to client:    331 User name okay, need password

PASS a from INITIAL THREAD
Thread-0 - send to client:    230 User logged in successfully

SYST from INITIAL THREAD
Thread-0 - send to client:    215 UNIX Type: L8

PWD from INITIAL THREAD
Thread-0 - send to client:    257 "/"

TYPE I from INITIAL THREAD
Thread-0 - send to client:    200 OK

CWD // from INITIAL THREAD
Thread-0 - send to client:    250 CWD successful. / is current directory

PASV from INITIAL THREAD
Thread-0 - send to client:    227 Entering Passive Mode (192,168,0,199,7,232)

waiting for connect... port: 2024
Data connection - Passive Mode - established
LIST from INITIAL THREAD
Thread-0 - send to client:    125 Opening ASCII mode data connection for file list.

from INITIAL THREAD
Thread-0 - send to client:    226 Transfer complete.

{/192.168.0.105=INITIALThread-0    Threads in data list: 1}
New connection received. Worker was created.

Thread-1 - send to client:    220 Welcome to the FTP-Server

FEAT 
Thread-1 - send to client:    211-Features:


Thread-1 - send to client:    MDTM


Thread-1 - send to client:    REST STREAM


Thread-1 - send to client:    SIZE


Thread-1 - send to client:    MLST type*;size*;modify*;


Thread-1 - send to client:    MLSD


Thread-1 - send to client:    UTF8


Thread-1 - send to client:    CLNT


Thread-1 - send to client:    MFMT


Thread-1 - send to client:    EPSV


Thread-1 - send to client:    EPRT


Thread-1 - send to client:    211 END

USER a 
Thread-1 - send to client:    331 User name okay, need password

PASS a 
Thread-1 - send to client:    230 User logged in successfully

EPSV ALL 
Thread-1 - send to client:    229 Entering Extended Passive Mode (|||2025|)

used by Thread-1 Thread DATA type
waiting for connect... port: 2025

1 Ответ

1 голос
/ 26 апреля 2019

EPSV ALL не EPSV.EPSV ALL имеет особое значение.Он используется клиентом для указания того, что он будет когда-либо использовать только EPSV, а не PASV, PORT или EPRT.Вы должны ответить только на что-то вроде 200 OK.Вы должны прочитать RFC 2428 .

На самом деле я никогда не видел ни одного FTP-клиента, использующего эту команду.Большинство серверов будут игнорировать это или обрабатывать это неправильно.Причина, по которой VLC не может связаться с вашим сервером, заключается в том, что в дополнение к неправильному ответу вы блокируете подключение своего элемента управления, ожидая входящую передачу данных.И VLC отправляет дальнейшие команды и время ожидания в ожидании ответа вашего сервера (и, следовательно, возможно, повторяет попытку при открытии нового соединения).

Это стенограмма соединения VLC с FTP-сервером FileZilla.Обратите внимание, что FileZilla также неправильно обрабатывает EPSV ALL, отвечая 229 Entering Extended Passive Mode.Но он не блокирует управляющее соединение и правильно обрабатывает следующие команды (включая более поздние EPSV).

230 Logged on
EPSV ALL
229 Entering Extended Passive Mode (|||65079|)
TYPE I
200 Type set to I
SIZE video.avi
213 119035510
EPSV
229 Entering Extended Passive Mode (|||63465|)
TYPE I
200 Type set to I
RETR video.avi
150 Opening data channel for file download from server of "/video.avi"
...

На самом деле, даже если команда была нормальной EPSV, блокировать не следуетуправляющее соединение, так как клиент будет отправлять дальнейшие команды, в частности RETR (или STOR, LIST, MLSD ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...