Форум: "Сети";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизИ все-таки - как копировать по сети. Найти похожие ветки
← →
Victor! © (2004-09-10 21:34) [0]Есть такая задача: приложение клиент-сервер, на сервере накапливается статическая база данных. Клиент, чтобы каждый раз не тянуть данные с сервера, делает кэш базы данных, локально на клиентской машине. В общем, все просто. Но, есть одна проблема, для меня, - на сервере делается выборка из базы данных и помещается в поток (TMemoryStream). Вопрос: Как правильно (надежно и быстро) передать этот поток клиенту.
Использую TClientSocket TServerSocket но:
- SendStream почему-то вообще ничего не шлет;
- SendBuf работает, но есть особенности:
1. если послать большой объем данных (напр. 1Мб) то на клиенте по событию onClientRead получается только порция 8кб (на разных компах по разному, бывает 4кб), но в процессе приема этих пакетов бывает что возникает ошибка (например, вместо 8192 придет 7125 байт) и прием целого мега уходит в ..., в общем, не принимается целиком и как надо.
2. зарекся я посылать сразу всю инфу из потока, и стал ее на сервере крошить по 4кб, а потом в цикле слать клиенту. Вроде работает, однако опять таки, есть одно но: бывает так, что вместо положенных 4096, клиент в onClientRead читает 8192 (или белиберду 0..8192). Складывается такое впечатление, что клиент просто не успевает в onClientRead читать пришедшие данные, и они где-то накапливаются, а то и вовсе теряются. Если на сервере в передающем цикле поставить побольше задержку между посылками, то все вроде начинает работать правильно, но жуть как долго, несчастный мег вместо положенной 1с копирует секунд 10.
Причем все эти проблемы, на разных машинах возникают или не возникают, но факт в том, что все они возникают на компе, на котором я пишу эту прогу. Хотя файлы WinComanderom копируются нормально, и фильмы по сети смотрятся.
По сему большой вопрос: как скопировать по сети поток, надежно, под любой виндой, и независимо от глючности компа (ну винда же как-то справляется с такими компами).
И еще, может кто знает, где достать хороший хелп по копированию по сетке, с описание какие вообще могут возникнуть при этом проблемы. Заранее благодарен.
← →
Verg © (2004-09-11 14:12) [1]http://webfile.ru/53165
Посмотри, может поможет.
Кстати, если "комп глючит", то вряд ли ты найдешь решение вообще, т.е. по определению...
← →
Victor! © (2004-09-11 21:27) [2]Но винда то с ним как-то справляется
← →
Anatoly Podgoretsky © (2004-09-12 08:03) [3]Но "винда" не использует TClientSocket
← →
Sheng © (2004-09-12 10:57) [4]Вот в том и вопрос - КАК скопировать поток больших размеров по сети??
В крайнем случае, можно скинуть выборку в файл, но с файлом возникала такая же проблема.
А комп глючит только с этой прогой. При копировании файлов тоталом скорость - нормальная, как и положено быть.
← →
Verg © (2004-09-12 13:09) [5]
> Вот в том и вопрос - КАК скопировать поток больших размеров
> по сети??
Что значит КАК? Я же даю пример:
> [1] Verg © (11.09.04 14:12)
> http://webfile.ru/53165
← →
Victor! © (2004-09-12 14:48) [6]За пример спасибо большое, дома работает, завтра проверю на работе. А на счет SendStream я ошибался: это с TMemoryStream какие-то глюки, с TFileStream все шлется и принимается.
← →
Verg © (2004-09-12 16:35) [7]
> TMemoryStream какие-то глюки, с TFileStream все шлется
> и принимается.
Опять "глюки"? Что-то больно много глюков у тебя случается :)
Надо бы задуматься, все же, может ты неправильно работаешь с этими объектами, не тогда, там и не того от них ждешь?
> Но, есть одна проблема, для меня, - на сервере делается
> выборка из базы данных и помещается в поток (TMemoryStream).
> - SendStream почему-то вообще ничего не шлет;
Надо ли тебя справшивать соизволил ли ты установить Position у этого мемстрима на ноль после записи в него данных и перед вызовом SendStream?
Это например...
Просто если неправильно работать с классами (объектами, библиотеками), то они окажутся "глючными", при том поголовно.
← →
Alexander_PK (2004-09-13 06:29) [8]Verg А подскажи, посредствам Mailslot"ов можно по сетки копировать? Если да, то как :)
← →
Victor! © (2004-09-14 17:20) [9]На счет Position=0, действительно как-то глупо получилось.
По поводу остального: и смотрел же я косо на это скромное замечание
Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections.
но не полагал, что именно оно является источником всех бед.
В общем, Спасибо Verg, все вдруг резко заработало. Ветку форума лучше спрятать, и никому не показывать.
← →
Verg © (2004-09-14 17:53) [10]Специально для пересылки файлов в WinSock есть еще такая ф-ция TransmitFile.
Попробуй - вдруг понравится.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c