Входящий поток FTP-соединения зависает

Я использую apache commons net FTPSClient для подключения к локальному ftp (пассивный режим). Связь зависает после

> LIST
< 150 Opening ASCII mode data connection for /bin/ls.

Я добавил запись в класс FTPClient, чтобы увидеть, где именно он завис. Он находится в этом методе: http://grepcode.com/file/repo1.maven.org/maven2 /commons-net/commons-net/3.3/org/apache/commons/net/ftp/FTPClient.java#FTPClient.initiateListParsing%28org.apache.commons.net.ftp.FTPFileEntryParser%2Cjava.lang.String%29

Создается сокет, и socket.isBound () возвращает true, как и socket.isConnected (), в то время как socket.isInputShutDown () возвращает false. Все кажется хорошо, пока ftp-клиент действительно не попытается прочитать из входящего потока, это зависает на неопределенное время без получения каких-либо данных. Wireshark не подходит из-за использования SSL.

На данный момент (из-за состояния сокета) я исключил проблемы с брандмауэром, но не понимаю, что могло вызвать зависание. Я предполагаю, что это серверная часть, и я могу поговорить с людьми, которые ее запускают, но было бы полезно, если бы я мог сказать им, где искать.

ОБНОВЛЕНИЕ

Я был бы признателен за объяснение, если за вопрос проголосовали против или за закрытие ... Мне кажется, что это идеальный вопрос о стеке.


person nablex    schedule 24.01.2014    source источник
comment
Ссылка в вопросе ...?   -  person nablex    schedule 24.01.2014
comment
Это не ваш код ... это код для FTP-клиента, который вы используете   -  person Peter Svensson    schedule 24.01.2014
comment
Угу, а FTPClient зависает при попытке чтения из входящего потока, созданного из сокета ...   -  person nablex    schedule 24.01.2014


Ответы (1)


С FTPS вы должны использовать PROT P, чтобы сделать канал данных TLS или PROT C для незащищенного канала данных. Он может зависнуть, потому что клиент и сервер не договорились о защите канала, например клиенты ждут от сервера незашифрованных данных, в то время как сервер ожидает приветствия клиента TLS от клиента, чтобы начать шифрование. Поэтому, пожалуйста, проверьте ваше сообщение на наличие команды "PROT" и ответы на нее.

Другие проблемы могут возникнуть, если FTP-сервер находится за маршрутизатором или брандмауэром. Режим PASV используется, когда клиент находится за брандмауэром, но вызовет проблемы, если сервер находится за «тупым» брандмауэром или NAT. Попробуйте, работает ли простой (например, без TLS) FTP.

person Steffen Ullrich    schedule 24.01.2014
comment
Проблема действительно была связана с отсутствующим рукопожатием. Большое спасибо! - person nablex; 24.01.2014