DownLoad, отслеживание прерывания закачки пользователем

MagicGTS

Новичок
DownLoad, отслеживание прерывания закачки пользователем

Не сочтите за труд подсказать. Проблема вот в чём. Написал Download скрипт (используя скрипт найденный здесь, и существенно модернизированный). Всё работает отлично, но возник вопрос, а как отследить когда клиент обрывает закачку. К примеру, FlashGet в логе пишет следующие:
Wed Jul 14 21:41:18 2004 Переход в состояние [Закачка]
Wed Jul 14 21:41:51 2004 User Cancel at 11325440.

Где последние цифры однозначно говорят о том, что это последние что клиент соблаговолил принять. Можно зарегить shutdown функцию, и в ней пытаться получить соответствующие сообщение от клиента.
Так вот, как получить это сообщение и у всех ли менеджеров закачки оно одинаковое?
Мне это нужно чтобы точно знать, смог ли клиент скачать весь файл или не смог.
Заодно ещё вопрос. Можно ли при мультисессионной закачке клиенту насильно впихнуть не тот кусок который он просит а другой (изменив параметры в сроке вида : Content-Range: bytes 2040819-10204098/10204099)? С одной стороны это вроде можно (параметры сменить :) ), но поймёт ли мой юмор клиент?
 

MagicGTS

Новичок
Это то я и сам мог отследить, что клиент связь оборвал. Мне нужно получить сообщение которое клиент отослал серверу. А как это сделать я что-то не очень представляю. Вроде нужен либо буфер входящих данных, либо какаято предопределённая переменная, куда эта месага и попадает, если попадает конечно :) .
 

Ghecko

Новичок
Мне кажется что такое ссобщение от клиета можно получить в скрипт только если твой скрипт общается с клиентом через сокет, в противном случае сообщение получит сервер...
 

MagicGTS

Новичок
Блин! Ну ясень пень что месагу получает сервер! Как её у сервера то отнять?!
 

BigHarry

Guest
С чего вы взяли, что сервер получает какую-то мессагу? Это если сервер ftp - то ему клиент может послать ABORT (да и то - необязательно)...
 

BigHarry

Guest
Интересно - и что же в логи сервер пишет?
Он может туда написать, что сессия прервалась - клиент оборвал TCP соединение - и не более того.
Но клиент для обрыва закачки ничего серверу не посылает - просто рвет соединение, и все...
 

MagicGTS

Новичок
Так, понятно. Значит в моём случае нет никакой гарантии в получение какой либо информации от клиента о причине дисконекта. И все возможные траблы придеться решать самому основываясь на информации из буферов отправки или ещё чего нибудь в том-же духе?

-~{}~ 16.06.04 11:03:

Ну а по поводу насильственного впихивания другого куска файла? Типа не того что заказывали, а того что я хочу отправить?
 

BigHarry

Guest
Нет, информации такой нету. А смыл в ней какой? Ну оборвал соединение - а по какой причине - плевать - баба с возу, кобыле легче... Если надо - то клиент сможет возобновить докачку - если он это умеет и сервер позволяет.
 

BigHarry

Guest
Originally posted by MagicGTS

Ну а по поводу насильственного впихивания другого куска файла? Типа не того что заказывали, а того что я хочу отправить?
Да ради Бога - можно отправить что угодно и с любого места - главное - что бы вписаться в размер, так как клиент из заголовка http может знать о размере принимаемого файла - и если ему будут впихивать что-то большее - то он навряд-ли проглотит это. Но опять-таки - в чем смысл - нет гарантии что клиент примя такой файл сможет его использовать - и он опять полезет выкачивать его по-новой...

-~{}~ 16.06.04 11:10:

Originally posted by desperado
разве? тогда как сервер отличает timeout и aborted?
Тайм-аут - это кады определенное количество времени соединение проставивает - клиент не принимает и не отправляет никаких данных, а абортед - кады соединение внезапно закрылось - т.е. серверу есчо было что отдать, но TCP соединение закрылось.
 

MagicGTS

Новичок
2desperado Это происходит на уровне транспортного протокола.

А мне необходимо давать пользователю возможность что-то скачать только 1 раз. Так требует заказчик. Если я не смогу определить где клиент перестал принимать данные я могу просто не отдать ему файл целиком. Я ещё расматьриваю возможность встроить небольшой запас по количеству скачиваемого из файла как раз на всякие траблы с мультисессией. Типа из файла в случае чего юзер сможет скачать ещё 10-15% после чего ему скажут что типа всё, докачался :) .

-~{}~ 16.06.04 11:15:

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

-~{}~ 16.06.04 11:16:

А то что можно тупо подсунуть другой кусок я и так знал, я бы такой идиотский вопрос бы и задавать не сал-бы.
 

BigHarry

Guest
Для этого надо как-то однозначно идентифицировать пользователя - лучше всего - по хитрожопому урлу для скачки. Мультисессию лучше сразу рвать - ненужна лишняя нагрузка на сервер. Определить, что файл был успешно скачан - ведь можно по количеству отданных байтиков - а кады клиент его скачал - хитрожопый урл удаляется из таблицы б/д...

-~{}~ 16.06.04 11:20:

Originally posted by MagicGTS
Я имел ввиду чтобы впихивать другой кусок таким образом, чтобы клиент понял, что это не то что он просил, а то что ему дают....
К сожалению - протокол http не позволяет такого - клиент запрашивает ресурс - а сервер ему либо его отдает, либо сообщает об ошибке. Сервер не может сказать, что файла porno.avi я тебе не дам, возьми взамен erotic.avi
 

MagicGTS

Новичок
2BigHarry Поведал истину! Этот механизм у меня уже работает! Вопрос не в этом совершенно! Потом нужна мне мультисессия или не нужна, это вопрос другой. Встроить механизм блокировки мультисессии или её ограничения совсем не проблема.
 

desperado

Новичок
2desperado Это происходит на уровне транспортного протокола.
ступил, не проснулся еще.

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

BigHarry

Guest
Попробуй тады клиенту отдавать другой файл взамен запрашиваемого через заголовок LOCATION
 

MagicGTS

Новичок
Поясняю более развернуто, нахрена мне нужно отдавать другой кусок файла. Вот у меня случилась трабла. Скрипт\сервер\или ещё что нибудь привело к разрыву соеденения с моей стороны таким образом, что я не смог отследить что клиенту уже отослал а что ещё нет. Вот клиент сного заходит и давай продолжать качать то что ему хочеться (из того что он еще не качал). А я говорю ему нет, скачай сного вот это, а потом качай на своё усмотрение что ещё надо.
 

desperado

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

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

BigHarry

Guest
Опять-таки - через LOCATION
(Код 203 - документ перемещен) - можно заставить клиента качать не то, что он запросил.
 
Сверху