Долгая задержка перед закрытием сокета - PullRequest
1 голос
/ 23 марта 2012

Сценарий:

Я создаю приложение, которое использует Commons Net FTPSClient для подключения к серверу.

Если соединение разорвано, я хочу его перезапустить. Я пытаюсь сделать это с помощью ftp.disconnect();

disconnect() звонки socket.close()

Разрыв соединения моделируется простым перетягиванием шнура.

Проблема:

socket.close() требуется около 9 минут (540 секунд) для закрытия.

Почему это? и как я могу это изменить?

socket.getSoLinger() возвращает -1 (отключено), а socket.getSoTimeout() возвращает 30000 (30 секунд)

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Чтобы определить проблему, вы можете запустить netstat, чтобы определить, в каком состоянии находится клиент (FIN_WAIT, TIME_WAIT и т. Д.) После вызова socket.close ().Это должно дать вам некоторое представление о том, где задержка составляет при .

1 голос
/ 23 марта 2012

Я думаю, что это проблема Функция поддержания канала управления:

Во время передачи файлов соединение для передачи данных занято, но соединение для управления бездействует.FTP-серверы знают, что управляющее соединение используется, поэтому не будут закрывать его из-за отсутствия активности, но сетевым маршрутизаторам гораздо сложнее узнать, что управляющие соединения и соединения для передачи данных связаны друг с другом.

ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes

и проверить его с помощью

    int iReply = ftpClient.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply))
            {
                ftpClient.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...