Проверка существования подключения к Socket Server со стороны клиента
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы| Страницы: (4) 1 [2] 3 4 все ( Перейти к последнему сообщению ) |
Проверка существования подключения к Socket Server со стороны клиента
|
Сообщ.
#16
,
|
|
|
|
Сбросил.
|
|
Сообщ.
#17
,
|
|
|
|
|
Сообщ.
#18
,
|
|
|
|
medved_68 ознакомился с Вашим юнитом - осознал свою никчёмность
; Но когда я сегодня забрал дивайс под который я писал софтину осознание никчёмности усилилось. Этот сервер работает только с одним клиентом . А у меня в проге как раз один клиент из нитки проверял подключение, а другой ждет события в не блокируемом режиме. Да и реакция на отключение сервера секунд 30. Ваш код не проверял хочу спросить Вашего разрешения или если Вы считаете что результат будет тот же подскажите как еще можно проверить связь. Благодарю за то что дочитали этот текст до конца . |
|
Сообщ.
#19
,
|
|
|
|
Цитата apprentice @ А у меня в проге как раз один клиент из нитки проверял подключение, а другой ждет события в не блокируемом режиме. А вот отсюда по подробнее. Клиенты на разных портах сидят? Или на одном, сначала отработает один, закроет сокет, потом другой? |
|
Сообщ.
#20
,
|
|
|
|
medved_68 Да нет они на одном порту висят но один в потоке, а второй просто висит. Тот что в потоке в синхронном и просто подключался отключался (тестил связь). Второй в асинхронном просто ждет события онРиад. Когда связь обрывалась и появлялась поток на это реагировал переподключая асинхронный сокет. Ну вощим пока я писал эту софтину и не было дивайса я сокет сервер держал на компе и все работало. И реагировало почти моментально, а сейчас увы.
|
|
Сообщ.
#21
,
|
|
|
|
Цитата apprentice @ Да нет они на одном порту висят но один в потоке, а второй просто висит. Весьма занятно. Занятно то, что система не позволит корректно открыть второй сокет на занятом порту, вернув код либо 10048, либо 10056. Поэтому вариант может быть только один - ты не проверяешь результат выполнения функции. Цитата apprentice @ Когда связь обрывалась и появлялась поток на это реагировал переподключая асинхронный сокет. Зачем? Первая же операция запись/чтение в/из сокета при обрыве связи вернет ошибку. Необходимо ее корректно обработать и переподключиться. Или дождаться восстановления линка и переподключиться. Зачем ты так "завернул"? |
|
Сообщ.
#22
,
|
|
|
|
Цитата medved_68 @ Зачем? Первая же операция запись/чтение в/из сокета при обрыве связи вернет ошибку. Необходимо ее корректно обработать и переподключиться. Или дождаться восстановления линка и переподключиться. Зачем ты так "завернул"? ![]() сокет кдиент тока принимает |
|
Сообщ.
#23
,
|
|
|
|
Цитата apprentice @ сокет кдиент тока принимает Он и отправлять данные тоже может. А если он работает только на прием, то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено... Ведь если нет канала (ну обрыв, всяко бывает) - ошибка отправки гарантирована и можно принимать решение - как жить дальше. |
|
Сообщ.
#24
,
|
|
|
|
Цитата medved_68 @ Цитата apprentice @ сокет кдиент тока принимает Он и отправлять данные тоже может. А если он работает только на прием, то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено... Ведь если нет канала (ну обрыв, всяко бывает) - ошибка отправки гарантирована и можно принимать решение - как жить дальше. ![]() Дык говорю же там дивайс. Не надо ему было сообщения слать. А я как то об этом не думал чтоб так тэстить или он включён. Попробую. Сработает не сработает не знаю но все равно Вам спасибо |
|
Сообщ.
#25
,
|
|
|
|
Цитата apprentice @ Дык говорю же там дивайс. Не надо ему было сообщения слать. Ты не ему сообщения шлешь. Стэк TCP/IP так устроен, что пришлет подтверждение ДОСТАВКИ пакета с флагом АСК. А твой девайс просто пакет проигнорирует и все. Но подтверждение получения пакета на той стороне ты получишь, а значит можно сделать вывод, что канал жив. Таким же образом работает и keep-alive пакеты. Таким же образом "проламывают" для ВХОДЯЩЕЙ связи NAT всякие Астериски и Скайпы... |
|
Сообщ.
#26
,
|
|
|
|
Цитата medved_68 @ Цитата apprentice @ Дык говорю же там дивайс. Не надо ему было сообщения слать. Ты не ему сообщения шлешь. Стэк TCP/IP так устроен, что пришлет подтверждение ДОСТАВКИ пакета с флагом АСК. А твой девайс просто пакет проигнорирует и все. Но подтверждение получения пакета на той стороне ты получишь, а значит можно сделать вывод, что канал жив. Таким же образом работает и keep-alive пакеты. Таким же образом "проламывают" для ВХОДЯЩЕЙ связи NAT всякие Астериски и Скайпы... ![]() ну по поводу просто проигнорирует то не совсем он плюнул в ответ. а о том что дивайс отключён я узнал через 20 сек примерно. Снизу привожу код отправки. Отправляю служебные коды дивайся поэтому выглядят чутка дико. ![]() ![]() procedure TKpp.ding(Sender: TObject); var Bufs:array[1..14] of byte; begin bufS[1]:=30; bufS[2]:=5; bufS[3]:=5; bufS[4]:=0; bufS[5]:=0; bufS[6]:=0; bufS[7]:=0; bufS[8]:=0; bufS[9]:=0; bufS[10]:=0; bufS[11]:=0; bufS[12]:=0; bufS[13]:=0; bufS[14]:=0; output.Socket.SendBuf(BufS,14) end; событие онИррор возникло спустя 20 сек код события онИррор. Можно ли как то ускорить проверку? Скажу честно раньше делал пингом. Было чуть быстрее но пинг со времинем при длительном отключении залипал и переставал реагировать да и там был только один дивайс а тут в теории их может быть до 15 |
|
Сообщ.
#27
,
|
|
|
|
Цитата medved_68 @ Занятно то, что система не позволит корректно открыть второй сокет на занятом порту, вернув код либо 10048, либо 10056. C чего бы это? Он же про удаленный порт (входящий на девайсе) говорит, а не локальный (исходящий на компе) Добавлено Цитата apprentice @ событие онИррор возникло спустя 20 сек Это когда по таймауту отвалилось, видимо. А еще можно проверять результат Send, либо при отправке взводить флаг и ожидать события OnWrite (не помню точно, как в этом классе сокета зовется событие отправки данных). В таймере проверять, если события отправки не происходит некоторое время - связь оборвана. |
|
Сообщ.
#28
,
|
|
|
|
Цитата Fr0sT @ Добавлено Цитата apprentice @ событие онИррор возникло спустя 20 сек Это когда по таймауту отвалилось, видимо. А еще можно проверять результат Send, либо при отправке взводить флаг и ожидать события OnWrite (не помню точно, как в этом классе сокета зовется событие отправки данных). В таймере проверять, если события отправки не происходит некоторое время - связь оборвана. Сейчас попробую порыть |
|
Сообщ.
#29
,
|
|
|
|
Цитата Fr0sT @ А еще можно проверять результат Send, Именно это я предлагаю делать: Цитата medved_68 @ то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено... Но, видимо, как то не так предлагаю... А 20 сек. для сети - это ерунда, можно смело забить. Весь вопрос в том, предусмотрена ли буферизация отправляемых пакетов пользовательским протоколом, чтобы можно было повторить отправку при восстановлении канала и без потерь данных. Добавлено Цитата Fr0sT @ Он же про удаленный порт (входящий на девайсе) говорит, а не локальный (исходящий на компе) Неужели? Цитата apprentice @ Да нет они на одном порту висят но один в потоке, а второй просто висит. Весьма трудно ClientSocket представить на удаленном девайсе в контексте процитированного. |
|
Сообщ.
#30
,
|
|
|
|
Цитата medved_68 @ Неужели? Ну, я понял эту фразу как "Они к одному порту присоединены", поскольку локальный порт в контексте задачи тут вообще не пришей кобыле хвост. Добавлено Цитата medved_68 @ 20 сек. для сети - это ерунда, можно смело забить Ага, особенно в realtime приложениях |