Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

Проверка соединения, пинг.   Найти похожие ветки 

 
AVK   (2004-06-29 15:06) [0]

Написал своеобразный чат. Для проверки соединения(т.е. на присутствие другой стороны) каждую секунды посылаю пакет, на который отвечает другая сторона. Если в течении 5-ти минут нет ответа, то считаем, что удаленной стороны уже нет :(
Все красиво работает, но есть беда: если запустить мощную игрулину, то программа не отвечает в течении этих 5-ти секунд и соединение обрывается. Как избежать такого момента?
Использую протокол UDP, таймер который с интервалом в одну секунду отсылает пакет и рестартует таймер, который обрывает связь если не было ответа в течении 5-ти секунд.


 
panov ©   (2004-06-29 15:25) [1]

ответ на поверхности - увеличить тайм-аут, либо повысить приоритет потока, в котором происходит проверка.


 
False_Delirium ©   (2004-06-29 15:33) [2]

Сделай пинг ступенями...

Первые три с интервлом в 5 сек ... если на все три ответа не получил, тогда через 45 сек., если и сейчас не было ответа тогда последний раз через минуту ... после этого считай мёртвым ..

и того на 2 минуты


 
Rouse_ ©   (2004-06-29 16:06) [3]

Вообщето все это реализуется по другому...
Если в течении какого то времени от какого то из участников не поступило ни одного ответа - запускаем процедуру проверки.
А ежесекундно слать запросы абсолютно нецелесобразная загрузка канала (тем более как я понял широковещательные)


 
False_Delirium ©   (2004-06-29 16:22) [4]

2Rouse_,привет.
"Вообщето все это реализуется по другому..." - это чем-то отличается от того, что написано в [2] ?

Интервалы можно варировать на своё усмотрение.


 
AVK   (2004-07-01 11:50) [5]

Пакеты не широковещательные.
Приоритет программы и увелечение тайм-аута не хотелось бы делать.
Пинг ступенями может и был бы выходом, но не хочется, что бы до программы "аш" через 2-е минуты доходило, что удаленной стороны нет.


 
False_Delirium ©   (2004-07-01 15:18) [6]

Если ты хочешь оставить реализацию чата на UDP, то остальные способы неминуемо приведу к излишней нагрузке сети и локальных ресурсов компьютера в частности.

Мало того, что ты не добьёшься одобрения со стороны пользователей при такой загрузки сети, так ещё и чат будет вести себя некорректно, т.к. UDP не гарантирует доставку пакетов. Будут странные потери сообщений и тд., если не реализован свой протокол, который подтверждает или перезапрашивает доставку. А реализовывать такое на програмном уровне куда более накладно, чем допустить поэтапный опрос каждого.

Хотя должен заметить, что если подобного механизма нет, то в любом случае буду возникать подобные казусы, если кто-то будет перезагружать сеть(например скачивать данные достаточно большого размера). Сам я чат не писал, поэтому не могу сказать какая наиболее оптимальная схема для такого ПО, но подобные недостатки присущи всем программам использующим UDP без механизма проверки доставки данных.

При при опросе "ступенями" ты можешь после первых двух запросов(10 сек) помечать запись в списке присутствующих жёлтым, а после полуминуты красным цветом. А через минуту уже отсоединять.

Это наиболее оптимальный способ, который используют многие другие популярные чаты.


 
ПЛОВ   (2004-07-01 16:41) [7]

Пусть прога "юзеря" при завершении отсылает на сервер чата или что там такое есть сообщение "я ухожу" - часть проблемы решена, если завершение сией программы "аварийное" то тут уже дали много советов... добавить нечего. молчу


 
AVK   (2004-07-02 00:20) [8]

Она так и делает, - отсылает удаленной стороне сообщение об уходе. Просто пинг я сделал для случая, если некоректно завершена работа и вот столкнулся с проблемой.
В программе я пока не сделал возможность многим пользователям общаться. Она только для двух человек. Она запускается из автозагрузки и сидит в трее. При соединении кого-либо(или при запросе на чат) подается звуковой сигнал. Очень удобная получилась программа для локальной сети.
На счет того, что программа "грузит" сеть я бы не сказал. Мало вероятно, что мои небольшие пакеты забьют стомегабитную сеть.
Собираюсь сделать подтверждение о том, что сообщение доставлено. Просто это может повлечь за собой другие не приятные моменты:) Сообщения уже терялись, когды была плохая связь. В программе есть другой вариант общения: все что вводится в TMemo, сразу же отображается на другой стороне. Т.е. если потеряется пакет это будет не так важно, т.к. при следующем вся информация восстановится.


 
Anatoly Podgoretsky ©   (2004-07-02 00:32) [9]

Нельзя по отсутствию одного ответа принмать решение о потери связи, надо как миними отсутствие ответов на три запроса подряд. Протокол UDP не гарантирует доставки.


 
AVK   (2004-07-02 09:39) [10]

У меня таймаут - 5-ть секунд. "Пингую" каждые 980мс. Но возникла такая ситуация, когда программа не получила ответа в течении этих 5-ти секунд(в связи с большой загрузкой системы).
Я думал, что есть какой-то красивый выход из ситуации.


 
False_Delirium ©   (2004-07-02 11:53) [11]

если ты до сих пор не внял советам :)

Выход - TCP.


 
ПЛОВ   (2004-07-02 15:14) [12]


> В программе я пока не сделал возможность многим пользователям
> общаться. Она только для двух человек.

)))))))))))

> Выход - TCP.

Да. Сам писал на нем чат. Могло общаться до 20 человек + у каждого свой цвет + администрирование (выкидывание, блокировка юзеря, "особые" мессаги от злого админа и т.п.) + отдельный приват. Смайлов правда не было (ломало), но чат получился прикольный... В очень редких случаях возникали глюки (да и то только если на сервере "пошалить")



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
3-1091796517
}|{yk
2004-08-06 16:48
2004.09.05
По эффективности


14-1092505999
Guest
2004-08-14 21:53
2004.09.05
Вот такое дело....


1-1093003639
kukuikar
2004-08-20 16:07
2004.09.05
Я изменил Dialogs.pas. Как мне переделать Dialogs.dcu?


3-1092079761
Hawk
2004-08-09 23:29
2004.09.05
Открытие файла БД


14-1092670319
Boris
2004-08-16 19:31
2004.09.05
Установка программы WinSight32





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский