Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.47 MB
Время: 0.043 c
14-1099839594
Vlad Oshin
2004-11-07 17:59
2004.11.21
Лучше. Рассказ


14-1099435107
iZEN
2004-11-03 01:38
2004.11.21
Microsoft выступает против Mono


1-1099568342
InfMag
2004-11-04 14:39
2004.11.21
Получение списка файлов и папок или что-то поотдельности


1-1100069141
YuriS
2004-11-10 09:45
2004.11.21
MDIForm


4-1097596116
F1
2004-10-12 19:48
2004.11.21
Как рисовать прямо на экране?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский