powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача данных по сети
15 сообщений из 15, страница 1 из 1
Передача данных по сети
    #34332909
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в нестабильной работе сети по DSL модему.
Пока клиент-сервер работают в локальной сети офиса, проблем нет. Сетка стабильная.
Когда клиента кладу на удалённый компьютер в другом городе, то работает до тех пор пока пинги непрерывны.
Как только команда пинг пишет "Превышен интервал ожидания", то клиент зависает. Даже если следующие пинги идут нормально - клиент как замороженный, т.е. блокирующий Socket ожидает данные в канале, а они туда, как-будто, не поступают. Но он знает, что ещё не всё выкачал, вот и ждёт.
При этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные.
Мне эту проблему как решать?? Программно или в настройках системы.
Первое, что пришло на ум - резать информацию на мелкие пакеты для передачи, хотя я думал, что этим должны заниматься системные сервисы/демоны.
Кто пишет клиент-серверные приложения - подскажите отчего такое происходит и как побороть?
...
Рейтинг: 0 / 0
Передача данных по сети
    #34333832
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZmeisheПроблема в нестабильной работе сети по DSL модему.
Пока клиент-сервер работают в локальной сети офиса, проблем нет. Сетка стабильная.
Когда клиента кладу на удалённый компьютер в другом городе, то работает до тех пор пока пинги непрерывны.
Как только команда пинг пишет "Превышен интервал ожидания", то клиент зависает. Даже если следующие пинги идут нормально - клиент как замороженный, т.е. блокирующий Socket ожидает данные в канале, а они туда, как-будто, не поступают. Но он знает, что ещё не всё выкачал, вот и ждёт.
При этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные.
Мне эту проблему как решать?? Программно или в настройках системы.
Первое, что пришло на ум - резать информацию на мелкие пакеты для передачи, хотя я думал, что этим должны заниматься системные сервисы/демоны.
Кто пишет клиент-серверные приложения - подскажите отчего такое происходит и как побороть?

в зависимости какой уровень юзаете..
если TCP то как раз он берёт на себя задачи по обеспечению канала связи. В том числе и те, которые Вы описали.
если UDP (к примеру) - то он гарантирует только ПЕРЕДАЧУ данных. а дойдут или нет - сель ави... Вы должны в данном случае сделать некие телодвижения по решению проблем, которые могут возникнуть при использовании этого уровня...


с уважением
(круглый)
ЗЫ
Сдаёться мне, что Вы не гоняли ваше приложение (даже в локальной сетке) на предмет отказоустойчивости... Скорее всего Вас ждут много сюрпризов. Это только первый. Последующие (давайте я сделаю умную рожу и проведу сеанс телепатии) возможно будут - сбои или падежи в уже отлаженной области (скажем много-нитеевость) вашего сервака. Когда этот баг с шаманством изведёте, попробуйте сделать следующии тесты...
1) в любой момент времени просто потянуть сетевую фишечку из гнезда сетевухи, во время работы Вашего клиента.
2) запустить Ваших клиентов на 10 машин, по 10 штук на каждой. Попробывать поиграться на разных машинах в разных фазах...
3) запустить несколько Ваших клиентов, и с 5 машин одновременно по 10 пингов, с длиной пакетов в 3000 байт и кол-вом в 1000 на Ваш сервак. Проверить работоспособность Ваших клиентов...
4) поставить в код логина терминэйтед процесс... позапускать раз 20-30 Вашего клиента...
ну и т.д...
список мона продолжать бесконечно...думаю это Вас натолкнёт на толковые размышления...
...
Рейтинг: 0 / 0
Передача данных по сети
    #34334299
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я готов гонять его и в хвост и в гриву - иначе это сделают за меня.

Но этот первый сюрприз решил так.

Я не стал читать из канала по 4 по 8 по 32 байта по мере необходимости программы.
Я стал читать в MemoryStream из канала сразу всё имеющееся в наличии. Читаю в цикле while пока не прочитаю всё, что должно придти. Да, я потерял в скорости в ДВА раза из-за чтения в этот бесполезный для меня буфер.
В общем, я получил ту же скорость, что и на DCOM, и избавился от подвисания (описанного в первом посте).
Сам это поведение сокета объяснить пока не могу. Думаю это связано с сервисами нижнего уровня (системного).
...
Рейтинг: 0 / 0
Передача данных по сети
    #34334406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZmeisheПри этом другая программа, работающая через DCOM, а не Socket, оживает и читает данные.

ИМХО ваше сравнение неуместно. DCOM - технология гораздо более выского уровня, и работать она может поверх многих протоколов. И поэтому писать DCOM и Socket через запятую нельзя. Иначе вас обвинят - в незнании основ сетей и протоколов.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34334486
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку я избавляюсь от DCOM и ухожу на Linux, то нечто иное(альтернативное) должно быть не хуже (не тормознутее).
Сравнивают в основном заказчики(юзеры), а им основы сетей и протоколов не интересны они их тоже не знают.
Должно работать не хуже - остальное твои, т.е. мои проблемы.
Поэтому и пишу через запятую, как прежнее и текущее состояние программного комплекса. Что там внутри, кроме разработчиков никому не интересно.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34337081
MAX2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без исходников тяжело определить причину подвисания, могу предположить, что у вас подвисает на момент вызова ф-ии connect у данной ф-ии есть timeout время ожидания связи, если вы хотите избавиться от ожидания то есть 2-а варианта:
1. Выносить код connect в отдельный поток
2. Делать неблокируемый коннект через WaitForSingleObject.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34337320
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется причина подвисания вот в чем:
посылатель посылает(допустим) 4 байта.
2 ушло, два не смогло по причине сбоя связи(превышен интервал ожидания).
посылатель получил ошибку в команде send. ты их обрабатываешь?

получатель ожидает 4 байта. два получил, еще два ждет.

посылатель ждет ответа от получателя что все ок.


вот так и ждут.

если обрабатывать send на предмет ошибок, возможно это поможет :)
...
Рейтинг: 0 / 0
Передача данных по сети
    #34337775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZmeisheПоскольку я избавляюсь от DCOM и ухожу на Linux, то нечто иное(альтернативное) должно быть не хуже (не тормознутее).

Вы создаёте свой собственный протокол взаимодействия систем поверх Sockets?
...
Рейтинг: 0 / 0
Передача данных по сети
    #34340041
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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кило. Нахомячил за обе щеки, а потом уже этот буфер распихиваю согласно алгоритму.
Клиенты уже час работают без подвисаний. Есть небольшие задержки на момент "Превышен интервал ожидания", но потом всё оживает и клиент продолжает работать как надо.

Понаблюдаю ещё.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34340206
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Цитирую "Дельфи советы программистов" стр 879: "Поскольку слой IP "режет" поток данных на куски 8 Кб, разработчик должен явно включить в начало потока целочисленную длину..."
Я кодировал обмен по сети и прошел все эти "камни" давно (есть еще другие). Я тоже не спец в TCP/IP. У меня есть решение в виде пары ocx (не бесплатно).
Резюме:
1)при отправке на любого клиента подряд нескольких посылок, ОС может склеить их в один пакет.
2)при отправке большого пакета ОС может разрезать его на несколько более мелких
3)на клиентской стороне сборка из пакетов или разделение пакета на несколько логических лежит на программисте.
Придумывая свой протокол, не забудьте включить в каждый лог. пакет анкеры начала, конца и длину пакета. На приемной стороне читаем поток (пока он есть) и занимаемся разделением (склейкой) его на лог. пакеты.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34340457
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pandrewУ меня есть решение в виде пары ocx (не бесплатно).
OCX без исходников не интересно - с исходниками вполне возможно, если
мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ?
...
Рейтинг: 0 / 0
Передача данных по сети
    #34340747
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZmeisheOCX без исходников не интересно - с исходниками вполне возможно, если
мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ?Да собственно, я не капризный, но это BCB (т.е. TSocketServer+TSocketClient). Однако, в позитиве, уже лет 5 в эксплуатации (основной транспорт для межмодульного обмена в больших проектах) и вылизано для очень разных применений. Дайте адрес вышлю описание.
Однако, есть вечная проблема адекватной цены и способов товарообмена между Питером и Нижним Новгородом. :))
...
Рейтинг: 0 / 0
Передача данных по сети
    #34340925
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZmeisheOCX без исходников не интересно - с исходниками вполне возможно, если
мы будем иметь право выложить Ваше (НЕ бесплатно) в свободный полёт — OpenSource ?Да собственно, я не капризный, но это BCB (т.е. TSocketServer+TSocketClient). Однако, в позитиве, уже лет 5 в эксплуатации (основной транспорт для межмодульного обмена в больших проектах) и вылизано для очень разных применений. Дайте адрес вышлю описание.
Однако, есть вечная проблема адекватной цены и способов товарообмена между Питером и Нижним Новгородом. :))
...
Рейтинг: 0 / 0
Передача данных по сети
    #34341380
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pandrewДайте адрес вышлю описание.
Адрес в профиле.
...
Рейтинг: 0 / 0
Передача данных по сети
    #34344085
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zmeishe...Понаблюдаю ещё.

Предположу что юзаете Вы TCP (судя по форточной функции бла-бла-Stream). Если так, то с ОЧЕНЬ большой вероятностью - траблы у Вас в коде. Дело в том, что TCP уровень ГАРАНТИРУЕТ последовательную доставку данных в виде потока. Всё остальное - от лукавого. Точнее можно смело строиться в стройные ряды и идти за нобелевской премией...Точнее к Гейтсу

Чтобы раскрутить ситуацию, попробуйте следующее...
1) взять из МСДНа стандартный пример соединения по TCP и прогнать по нему 500 метров данных...Посмотреть, много подумать...
2) воткнуть к се в программу данные кусочки (клиента) и БЕЗ РАЗБОРКИ данных прогнать эти несчастные 500 метров. клиента оставить пока на форточках...
3) воткнуть в код серверный кусочек с форточек, без разбора(сборки) данных. прогнать...
4) на стороне передатчика - сделать со сборкой большой кусок данных..прогнать...
5) прогнать с разборкой данных, код как в оригинале...

если будете педантно выполнять сие телодвижеия - где нибуть у Вас обнаружиться проблемы. Вот их и решайте...
Можно по другому...
У Вас я надеюсь есть враперы вокруг вшивеньких вентелей вызовов сетевого слоя ? Вот там втупую и поставте счётчики данных... Если нет - то сделайте...После подсчёта трафика уходящего и приходящего - много думать... скорее всего клиент хочет больше, чем послал передатчик. Для избежания таких трабл - нужно Ваш счётчик всего принятых байт передавать как контрльной на более нижнии слои, где идёт парсирование Ваших принятых данных (для контроля длины ожидания)...


удачи Вам
(круглый)
ЗЫ
Поверьте - Вы не первый "открываете америку". Увы и ах - как правило, в 99,9% случаев виноват программист...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача данных по сети
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]