Поведение клиента при прерывании передачи данных на FTP-сервер

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

ABORCommand(); //sends message with code 226 (1st message)
pthread_join(threads, &ret);  //waits for the thread processing data transfer

sprintf(buffer, "226 Transfer complete - %d bytes copied.\r\n", data_comm->num_bytes);
Send(); //this just sends the message in buffer to the client (2nd message)
WriteToLog("transfer complete", "226");

close(data_comm->clie_sock);   //closes the data connection
delete data_comm;  //this deletes instance of the class taking care of data transfer
  1. Моя проблема в том, что два клиента, которых я тестирую (клиент Nautilus и gftp), ведут себя по-разному при прерывании передачи данных.
  2. То, чего я пытаюсь добиться, — это возможность прервать процесс передачи данных без ошибок с использованием разных клиентов.
  3. Поведение клиентов зависит от сообщений, которые я им отправляю.
  4. Когда я прерываю передачу с помощью Nautilus, все работает нормально, без ошибок, без утечек. Но с клиентом gftp клиент получает первое сообщение и затем закрывает управляющее соединение. Затем сервер отправляет второе сообщение клиенту. После этого сервер должен получить что-то от клиента, но когда это происходит, я получаю сообщение об ошибке и массу утечек памяти. Я знаю, что чтение из закрытого сокета дает ошибку, но это не должно привести к сбою всей программы.
  5. Я пытался заставить аборт работать на клиенте gftp, и единственным (частичным) решением было отправить только второе сообщение (ну, я думаю, не имеет значения, какой пункт я отправляю — отправить только одно из них). После этого я не получил никаких ошибок и никаких утечек памяти. Единственной проблемой оставалось то, что клиент все еще закрывал контрольное соединение. Затем сервер закрыл соединение на своем конце, потому что клиент явно отключился (даже клиент gftp написал «Отключение от локального узла сайта»), но после того, как сервер закрыл его, gftp пишет «Ошибка: удаленный локальный узел отключен. Повторное подключение через 30 секунды».
  6. Решение, однако, имело побочный эффект. Клиент Наутилус перестал работать. Клиент получил сообщение, но все еще ждал другого (я так думаю), потому что я отправил ему только одно сообщение.
  7. Мой вопрос: как можно заставить его работать на обоих клиентов? Единственная идея, которая у меня есть, это то, что, возможно, код ответа неправильный. Пожалуйста, скажите мне, в чем проблема.

Спасибо

0

Решение

Хорошо, сначала ты правда

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

Так да :

  • Вы должны быть устойчивы к ошибкам: систематически проверяйте коды возврата и обрабатывайте их правильно
  • у вас не должно быть утечек памяти: используйте умные указатели, чтобы освободить неиспользуемые блоки памяти

А также в общем виде:

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

После этого я не очень хорошо понимаю вашу проблему. Так что смотрите мои комментарии, и я буду обновлять этот ответ.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]