IdFtp.List иногда выдает ошибку сокета # 10054

Когда я вызываю функцию

IdFtp.List(myList, '', false);

после того, как я вошел в систему и изменил каталог ftp, я получаю исключение ошибки сокета # 10054 («Соединение сброшено одноранговым узлом»).

Когда я вызываю эту функцию, например. 20 раз подряд я получаю это исключение 1 раз.

С этой проблемой я столкнулся только в ОС Vista.

Кто-нибудь знает, в чем проблема или как ее избежать?


person markus_ja    schedule 28.03.2012    source источник
comment
У меня возникла аналогичная проблема при подключении из-за того, что команда FEAT не поддерживается на моем сервере, я установил для idftp.AutoIssueFEAT значение false, и проблема исчезла. Но вы получаете ту же проблему из другого источника, не зная, что это в вашем случае.   -  person Warren P    schedule 02.11.2012


Ответы (3)


Вы ничего не можете с этим поделать, потому что отключение выполняется FTP-сервером. У вас есть несколько вариантов:

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

Вот снимок экрана с настройками тайм-аута FileZilla FTP-сервера:

введите здесь описание изображения

Обратите внимание, что с указанными выше настройками FTP-клиент будет отключен через 2 минуты бездействия.
Установив для этого значения значение 0, тайм-аут будет отключен.

person kobik    schedule 28.03.2012
comment
На моей машине и на большинстве других клиентов это работает без проблем (поэтому я не могу воспроизвести). Я думаю, это зависит от клиентской машины. - person markus_ja; 29.03.2012

Протокол FTP использует несколько сокетных соединений. Каждый раз, когда вы вызываете List(), устанавливается новое сокетное соединение для передачи запрошенных данных листинга. Похоже, FTP-сервер не всегда правильно закрывает сокет в конце передачи.

person Remy Lebeau    schedule 28.03.2012
comment
Странно то, что почти первый вызов выдает исключение. Я только что проверил файл журнала ftp-сервера, как другие инструменты LIST файлы (iexplorer, firefox). Одно отличие состоит в том, что они используют режим PASSIVE, а затем используется другой ПОРТ для передачи данных. - person markus_ja; 29.03.2012
comment
Команда PORT используется для передачи в активном режиме, когда FTP-сервер подключается к клиенту. Команда PASV используется для пассивной передачи, когда клиент подключается к FTP-серверу. Передача в пассивном режиме более удобна для клиентов, использующих брандмауэр/маршрутизатор. TIdFTP имеет свойство Passive для указания используемого режима. В любом случае FTP-сервер отключает сокет после завершения передачи запрошенных данных, что может привести к ошибке 10054, если сделать это неправильно. Я постараюсь обновить Indy, чтобы справиться с этим лучше, но сейчас у меня нет ETA по этому поводу. - person Remy Lebeau; 29.03.2012

В компоненте "IdFTP" измените следующие свойства:

  • "Пассивный" = "Ложный"
  • "ТипТрансфера" = "ftASCII"
person Luciano Trevisan Alberti    schedule 17.02.2016