|
|
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
Проблема в нестабильной работе сети по DSL модему. Пока клиент-сервер работают в локальной сети офиса, проблем нет. Сетка стабильная. Когда клиента кладу на удалённый компьютер в другом городе, то работает до тех пор пока пинги непрерывны. Как только команда пинг пишет "Превышен интервал ожидания", то клиент зависает. Даже если следующие пинги идут нормально - клиент как замороженный, т.е. блокирующий Socket ожидает данные в канале, а они туда, как-будто, не поступают. Но он знает, что ещё не всё выкачал, вот и ждёт. При этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные. Мне эту проблему как решать?? Программно или в настройках системы. Первое, что пришло на ум - резать информацию на мелкие пакеты для передачи, хотя я думал, что этим должны заниматься системные сервисы/демоны. Кто пишет клиент-серверные приложения - подскажите отчего такое происходит и как побороть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 12:39 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
ZmeisheПроблема в нестабильной работе сети по DSL модему. Пока клиент-сервер работают в локальной сети офиса, проблем нет. Сетка стабильная. Когда клиента кладу на удалённый компьютер в другом городе, то работает до тех пор пока пинги непрерывны. Как только команда пинг пишет "Превышен интервал ожидания", то клиент зависает. Даже если следующие пинги идут нормально - клиент как замороженный, т.е. блокирующий Socket ожидает данные в канале, а они туда, как-будто, не поступают. Но он знает, что ещё не всё выкачал, вот и ждёт. При этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные. Мне эту проблему как решать?? Программно или в настройках системы. Первое, что пришло на ум - резать информацию на мелкие пакеты для передачи, хотя я думал, что этим должны заниматься системные сервисы/демоны. Кто пишет клиент-серверные приложения - подскажите отчего такое происходит и как побороть? в зависимости какой уровень юзаете.. если TCP то как раз он берёт на себя задачи по обеспечению канала связи. В том числе и те, которые Вы описали. если UDP (к примеру) - то он гарантирует только ПЕРЕДАЧУ данных. а дойдут или нет - сель ави... Вы должны в данном случае сделать некие телодвижения по решению проблем, которые могут возникнуть при использовании этого уровня... с уважением (круглый) ЗЫ Сдаёться мне, что Вы не гоняли ваше приложение (даже в локальной сетке) на предмет отказоустойчивости... Скорее всего Вас ждут много сюрпризов. Это только первый. Последующие (давайте я сделаю умную рожу и проведу сеанс телепатии) возможно будут - сбои или падежи в уже отлаженной области (скажем много-нитеевость) вашего сервака. Когда этот баг с шаманством изведёте, попробуйте сделать следующии тесты... 1) в любой момент времени просто потянуть сетевую фишечку из гнезда сетевухи, во время работы Вашего клиента. 2) запустить Ваших клиентов на 10 машин, по 10 штук на каждой. Попробывать поиграться на разных машинах в разных фазах... 3) запустить несколько Ваших клиентов, и с 5 машин одновременно по 10 пингов, с длиной пакетов в 3000 байт и кол-вом в 1000 на Ваш сервак. Проверить работоспособность Ваших клиентов... 4) поставить в код логина терминэйтед процесс... позапускать раз 20-30 Вашего клиента... ну и т.д... список мона продолжать бесконечно...думаю это Вас натолкнёт на толковые размышления... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 15:34 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
Я готов гонять его и в хвост и в гриву - иначе это сделают за меня. Но этот первый сюрприз решил так. Я не стал читать из канала по 4 по 8 по 32 байта по мере необходимости программы. Я стал читать в MemoryStream из канала сразу всё имеющееся в наличии. Читаю в цикле while пока не прочитаю всё, что должно придти. Да, я потерял в скорости в ДВА раза из-за чтения в этот бесполезный для меня буфер. В общем, я получил ту же скорость, что и на DCOM, и избавился от подвисания (описанного в первом посте). Сам это поведение сокета объяснить пока не могу. Думаю это связано с сервисами нижнего уровня (системного). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 17:11 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
ZmeisheПри этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные. ИМХО ваше сравнение неуместно. DCOM - технология гораздо более выского уровня, и работать она может поверх многих протоколов. И поэтому писать DCOM и Socket через запятую нельзя. Иначе вас обвинят - в незнании основ сетей и протоколов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 17:29 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
Поскольку я избавляюсь от DCOM и ухожу на Linux, то нечто иное(альтернативное) должно быть не хуже (не тормознутее). Сравнивают в основном заказчики(юзеры), а им основы сетей и протоколов не интересны они их тоже не знают. Должно работать не хуже - остальное твои, т.е. мои проблемы. Поэтому и пишу через запятую, как прежнее и текущее состояние программного комплекса. Что там внутри, кроме разработчиков никому не интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 17:41 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
без исходников тяжело определить причину подвисания, могу предположить, что у вас подвисает на момент вызова ф-ии connect у данной ф-ии есть timeout время ожидания связи, если вы хотите избавиться от ожидания то есть 2-а варианта: 1. Выносить код connect в отдельный поток 2. Делать неблокируемый коннект через WaitForSingleObject. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 16:15 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
мне кажется причина подвисания вот в чем: посылатель посылает(допустим) 4 байта. 2 ушло, два не смогло по причине сбоя связи(превышен интервал ожидания). посылатель получил ошибку в команде send. ты их обрабатываешь? получатель ожидает 4 байта. два получил, еще два ждет. посылатель ждет ответа от получателя что все ок. вот так и ждут. если обрабатывать send на предмет ошибок, возможно это поможет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 17:12 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
ZmeisheПоскольку я избавляюсь от DCOM и ухожу на Linux, то нечто иное(альтернативное) должно быть не хуже (не тормознутее). Вы создаёте свой собственный протокол взаимодействия систем поверх Sockets? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 20:21 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
maytonВы создаёте свой собственный протокол взаимодействия систем поверх Sockets?Смотря что считать протоколом. Если как способ передачи данных — думаю это TCP и я туда не лезу. Если как формат общения клиента и сервера — да, свой собственный. На стороне Linux сервера я использую классы Qt — QServerSocket и QSocket. На стороне Win клиента классы C++Builder`a — TClientSocket и TWinSocketStream. MAX2002без исходников тяжело определить причину подвисания, могу предположить, что у вас подвисает на момент вызова ф-ии connect Connect мгновенный, тормоза начинаются, когда данных больше 8 кило. alex_kмне кажется причина подвисания... Я думаю (предполагаю) причина вот в чём: Я в начале посылаю 4 байта (int32) - число, указывающее сколько должно быть всего в байтах. Проверил на примере - 52 кило должно быть. Проверяю, а сколько пришло - 8 кило. И начинаю читать по 4 байта, 32, 16 и т.д. Разгрёб 8 кило - снова проверяю сколько там в очереди стоит - опять 8 кило... Если читать из канала по "крупинкам" - как воробей пшено. И между операциями чтения чего-то там анализировать, строить, считать, то на сервере проходит таймаут и сервак считает - клиент больше не заинтересован в этих данных и сервак их забывает или ждёт, когда его попросят повторить т.к. события CloseConnection ещё не было и сессия активна. Клиент ждёт, когда же дойдёт остаток от 52 кило, а его нет. Возникает иллюзия зависания. На моём сервере приложений никаких действий не происходит в этот момент. Я пока не все его события обрабатываю. Может какие-то и сообщают о том, что данные не дошли. Буду посмотреть. Возможно там есть сигнал о том, с какого байта повторить. Но сильно сомневаюсь т.к. отправляю целый блок, как единое целое. Кто там его на куски рубит не знаю. Возможно внутренние функции библиотеки Qt, а возможно сам TCP/. Сегодня я читаю из канала этими ломтями по 8 кило за раз, не отвлекаясь на анализ и прочие вычисления. Быстро-быстро запихиваю всё в локальный буфер все 52кило. Нахомячил за обе щеки, а потом уже этот буфер распихиваю согласно алгоритму. Клиенты уже час работают без подвисаний. Есть небольшие задержки на момент "Превышен интервал ожидания", но потом всё оживает и клиент продолжает работать как надо. Понаблюдаю ещё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 10:00 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
Цитирую "Дельфи советы программистов" стр 879: "Поскольку слой IP "режет" поток данных на куски 8 Кб, разработчик должен явно включить в начало потока целочисленную длину..." Я кодировал обмен по сети и прошел все эти "камни" давно (есть еще другие). Я тоже не спец в TCP/IP. У меня есть решение в виде пары ocx (не бесплатно). Резюме: 1)при отправке на любого клиента подряд нескольких посылок, ОС может склеить их в один пакет. 2)при отправке большого пакета ОС может разрезать его на несколько более мелких 3)на клиентской стороне сборка из пакетов или разделение пакета на несколько логических лежит на программисте. Придумывая свой протокол, не забудьте включить в каждый лог. пакет анкеры начала, конца и длину пакета. На приемной стороне читаем поток (пока он есть) и занимаемся разделением (склейкой) его на лог. пакеты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 10:51 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
pandrewУ меня есть решение в виде пары ocx (не бесплатно). OCX без исходников не интересно - с исходниками вполне возможно, если мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 11:59 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
ZmeisheOCX без исходников не интересно - с исходниками вполне возможно, если мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ?Да собственно, я не капризный, но это BCB (т.е. TSocketServer+TSocketClient). Однако, в позитиве, уже лет 5 в эксплуатации (основной транспорт для межмодульного обмена в больших проектах) и вылизано для очень разных применений. Дайте адрес вышлю описание. Однако, есть вечная проблема адекватной цены и способов товарообмена между Питером и Нижним Новгородом. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 13:19 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
ZmeisheOCX без исходников не интересно - с исходниками вполне возможно, если мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ?Да собственно, я не капризный, но это BCB (т.е. TSocketServer+TSocketClient). Однако, в позитиве, уже лет 5 в эксплуатации (основной транспорт для межмодульного обмена в больших проектах) и вылизано для очень разных применений. Дайте адрес вышлю описание. Однако, есть вечная проблема адекватной цены и способов товарообмена между Питером и Нижним Новгородом. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 14:01 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
pandrewДайте адрес вышлю описание. Адрес в профиле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 15:43 |
|
||
|
Передача данных по сети
|
|||
|---|---|---|---|
|
#18+
Zmeishe...Понаблюдаю ещё. Предположу что юзаете Вы TCP (судя по форточной функции бла-бла-Stream). Если так, то с ОЧЕНЬ большой вероятностью - траблы у Вас в коде. Дело в том, что TCP уровень ГАРАНТИРУЕТ последовательную доставку данных в виде потока. Всё остальное - от лукавого. Точнее можно смело строиться в стройные ряды и идти за нобелевской премией...Точнее к Гейтсу Чтобы раскрутить ситуацию, попробуйте следующее... 1) взять из МСДНа стандартный пример соединения по TCP и прогнать по нему 500 метров данных...Посмотреть, много подумать... 2) воткнуть к се в программу данные кусочки (клиента) и БЕЗ РАЗБОРКИ данных прогнать эти несчастные 500 метров. клиента оставить пока на форточках... 3) воткнуть в код серверный кусочек с форточек, без разбора(сборки) данных. прогнать... 4) на стороне передатчика - сделать со сборкой большой кусок данных..прогнать... 5) прогнать с разборкой данных, код как в оригинале... если будете педантно выполнять сие телодвижеия - где нибуть у Вас обнаружиться проблемы. Вот их и решайте... Можно по другому... У Вас я надеюсь есть враперы вокруг вшивеньких вентелей вызовов сетевого слоя ? Вот там втупую и поставте счётчики данных... Если нет - то сделайте...После подсчёта трафика уходящего и приходящего - много думать... скорее всего клиент хочет больше, чем послал передатчик. Для избежания таких трабл - нужно Ваш счётчик всего принятых байт передавать как контрльной на более нижнии слои, где идёт парсирование Ваших принятых данных (для контроля длины ожидания)... удачи Вам (круглый) ЗЫ Поверьте - Вы не первый "открываете америку". Увы и ах - как правило, в 99,9% случаев виноват программист... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2007, 14:57 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34340747&tid=2029413]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 457ms |

| 0 / 0 |
