2015-02-11 2 views
0

Я реализую в виде своего рода протокол FTP.FTP-реализация: закрывать сокеты данных каждый раз

У меня работает сервер. Я запускаю клиент, подключаюсь к серверу, а затем отправляю запрос GET file.txt. Клиент проанализирует команду, см. Команду GET и запустит серверный сокет. Сервер получает команду и запускает соединение с клиентом и начинает отправку файла file.txt по этому соединению.

Когда сервер отправил файл, он закрывает клиентский сокет (данные).

Когда я хочу ПОЛУЧИТЬ другой файл, порт уже используется. Как я могу предотвратить это? Должен ли я держать соединение данных открытым для всех сеансов командного соединения? В этом случае, как мой клиент может знать, когда файл закончился?

Благодаря

ответ

1

Когда сокет закрыт, он входит в TIME WAIT состояние (see here for the possible TCP states) и никакой другой сокет не может быть связан с одной и той же пары адрес/порт, пока гнездо не оставляет TIME WAIT и находится в CLOSED состоянии.

Вы можете обойти это, установив опцию SO_REUSEADDR сокета, что позволит два гнезда, которые будут связаны с тем же адресом, если один из разъемов находится в TIME WAIT состоянии.

+0

Это способ используется FTP? –

+0

@FedericoPonzi Я на самом деле не знаю, но это кажется логичным. Он часто используется для всех пассивных (прослушивающих) сокетов. –

1

Вам необходимо открыть сокет для передачи каждый раз, когда сервер закроет его при завершении передачи. вы будете знать, что файл загружается/загружено чтение ответа от FTP-сервера для кода состояния (226 или 250) - Контрольный список FTP-сервер возвратных кодов: https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes

-1

В моем проекте я использую Apache-commons- net, просто держите командное соединение живым с помощью команды heartbeat, и enter local passive mode каждый раз, чтобы сделать файл tranfer. Принцип такой же для вашей ситуации, я предлагаю отправить команду EPSV перед тем, как ПОЛУЧИТЬ файл .txt.

относятся: https://commons.apache.org/proper/commons-net/

Смежные вопросы