Re: Пересылка через сокеты больших обьемов данных
От: Anton Golinko  
Дата: 27.11.09 21:18
Оценка:
Здравствуйте, Alexey Voytsehovich, Вы писали:

AV>Дано: необходимо переслать с клиента на сервер большой обьем данных (не хотелось бы ограничивать себя), с получением от сервера обратно подтверждения о получении данных.


AV>Что есть. Есть ICS библиотека асинхронных сокетов, у которых есть send и recv (упрощенно).


Правильно, зачем изобретать велосипед, когда все уже изобретено до нас

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

1. Качать Ыксплорером
Обрыв связи — и перезакачивать все заново.
Это обычный TCP-стриминг.

2. Качать Оперой/Огнелисом.
При обрыве связи, есть возможность возобновления закачки.
Это более интеллектуальная передача контента, с возможностью его "дособирания" по кусочкам

3. Качать даунлоадменеджером.
Многопоточная закачка, сразу нескольких кусков контента.
Максимальная производительность — если пакет от одного чанка где-то и застрял, то освободившуюся нишу в ширине канале займет пакет из другого чанка.
Это более продвинутая разновидность второго способа.

=================================================================
Навскидку, мой mindflow:

Для обеспечения надежности нужно каким-то образом возобновлять коннект. Предположим что связь осуществляется по принципу как в HTTP — на каждый запрос, должен быть ответ.

У каждой пары Request&Response должен быть уникальный ID — для запроса и ответа. RequestID и ResponseID.
При обрыве связи инициирующая сторона должна переконнектится и:
1. Если она передавала данные, то она должна спросить у другой стороны сколько данных та получила(по ID), и возобновить передачу с места обрыва
2. Если принимала данные, то также само: переконнектится, сказать что мне нужны данные для такого-то запроса(ID), с такого-то места

На каждой стороне должен быть таймаут на время жизни запроса.
Например если клиент при заборе данных с сервера, оборвался, и не переконнектился в течении timeout, то буффер (кеш ответа) на сервере очищается.


Как-то где-то так,
а сейчас спать!
хронический недосып, это очень и очень плохо...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.