На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
Страницы: (4) 1 [2] 3 4  все  ( Перейти к последнему сообщению )  
> Проверка существования подключения к Socket Server со стороны клиента
    Сбросил. :D
      Цитата medved_68 @
      Цитата apprentice @
      Только не сочтите за наглость но не могли бы Вы выложить текст данного юнита целиком.

      Мыло в приват - сброшу. :D

      Спасибо за то что показали правильно решение
        medved_68 ознакомился с Вашим юнитом - осознал свою никчёмность :blink: ; Но когда я сегодня забрал дивайс под который я писал софтину осознание никчёмности усилилось. Этот сервер работает только с одним клиентом :wall: . А у меня в проге как раз один клиент из нитки проверял подключение, а другой ждет события в не блокируемом режиме. Да и реакция на отключение сервера секунд 30. Ваш код не проверял хочу спросить Вашего разрешения или если Вы считаете что результат будет тот же подскажите как еще можно проверить связь. Благодарю за то что дочитали этот текст до конца :D .
          Цитата apprentice @
          А у меня в проге как раз один клиент из нитки проверял подключение, а другой ждет события в не блокируемом режиме.

          А вот отсюда по подробнее. Клиенты на разных портах сидят? Или на одном, сначала отработает один, закроет сокет, потом другой? :unsure:
            medved_68 Да нет они на одном порту висят но один в потоке, а второй просто висит. Тот что в потоке в синхронном и просто подключался отключался (тестил связь). Второй в асинхронном просто ждет события онРиад. Когда связь обрывалась и появлялась поток на это реагировал переподключая асинхронный сокет. Ну вощим пока я писал эту софтину и не было дивайса я сокет сервер держал на компе и все работало. И реагировало почти моментально, а сейчас увы.
              Цитата apprentice @
              Да нет они на одном порту висят но один в потоке, а второй просто висит.

              Весьма занятно. Занятно то, что система не позволит корректно открыть второй сокет на занятом порту, вернув код либо 10048, либо 10056. Поэтому вариант может быть только один - ты не проверяешь результат выполнения функции. :D
              Цитата apprentice @
              Когда связь обрывалась и появлялась поток на это реагировал переподключая асинхронный сокет.

              Зачем? Первая же операция запись/чтение в/из сокета при обрыве связи вернет ошибку. Необходимо ее корректно обработать и переподключиться. Или дождаться восстановления линка и переподключиться. Зачем ты так "завернул"? :blink: :blink: :D
                Цитата medved_68 @
                Зачем? Первая же операция запись/чтение в/из сокета при обрыве связи вернет ошибку. Необходимо ее корректно обработать и переподключиться. Или дождаться восстановления линка и переподключиться. Зачем ты так "завернул"? :blink: :blink: :D

                сокет кдиент тока принимает
                  Цитата apprentice @
                  сокет кдиент тока принимает

                  :lool: Он и отправлять данные тоже может. А если он работает только на прием, то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено... Ведь если нет канала (ну обрыв, всяко бывает) - ошибка отправки гарантирована и можно принимать решение - как жить дальше. :D
                    Цитата medved_68 @
                    Цитата apprentice @
                    сокет кдиент тока принимает

                    :lool: Он и отправлять данные тоже может. А если он работает только на прием, то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено... Ведь если нет канала (ну обрыв, всяко бывает) - ошибка отправки гарантирована и можно принимать решение - как жить дальше. :D

                    Дык говорю же там дивайс. Не надо ему было сообщения слать. А я как то об этом не думал чтоб так тэстить или он включён. Попробую. Сработает не сработает не знаю но все равно Вам спасибо
                      Цитата apprentice @
                      Дык говорю же там дивайс. Не надо ему было сообщения слать.

                      Ты не ему сообщения шлешь. Стэк TCP/IP так устроен, что пришлет подтверждение ДОСТАВКИ пакета с флагом АСК. А твой девайс просто пакет проигнорирует и все. Но подтверждение получения пакета на той стороне ты получишь, а значит можно сделать вывод, что канал жив. Таким же образом работает и keep-alive пакеты. Таким же образом "проламывают" для ВХОДЯЩЕЙ связи NAT всякие Астериски и Скайпы... :D
                        Цитата medved_68 @
                        Цитата apprentice @
                        Дык говорю же там дивайс. Не надо ему было сообщения слать.

                        Ты не ему сообщения шлешь. Стэк TCP/IP так устроен, что пришлет подтверждение ДОСТАВКИ пакета с флагом АСК. А твой девайс просто пакет проигнорирует и все. Но подтверждение получения пакета на той стороне ты получишь, а значит можно сделать вывод, что канал жив. Таким же образом работает и keep-alive пакеты. Таким же образом "проламывают" для ВХОДЯЩЕЙ связи NAT всякие Астериски и Скайпы... :D

                        ну по поводу просто проигнорирует то не совсем он плюнул в ответ. а о том что дивайс отключён я узнал через 20 сек примерно. Снизу привожу код отправки. Отправляю служебные коды дивайся поэтому выглядят чутка дико.

                        ExpandedWrap disabled
                          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
                          Цитата medved_68 @
                          Занятно то, что система не позволит корректно открыть второй сокет на занятом порту, вернув код либо 10048, либо 10056.

                          C чего бы это? Он же про удаленный порт (входящий на девайсе) говорит, а не локальный (исходящий на компе)

                          Добавлено
                          Цитата apprentice @
                          событие онИррор возникло спустя 20 сек

                          Это когда по таймауту отвалилось, видимо. А еще можно проверять результат Send, либо при отправке взводить флаг и ожидать события OnWrite (не помню точно, как в этом классе сокета зовется событие отправки данных). В таймере проверять, если события отправки не происходит некоторое время - связь оборвана.
                            Цитата Fr0sT @
                            Добавлено
                            Цитата apprentice @
                            событие онИррор возникло спустя 20 сек

                            Это когда по таймауту отвалилось, видимо. А еще можно проверять результат Send, либо при отправке взводить флаг и ожидать события OnWrite (не помню точно, как в этом классе сокета зовется событие отправки данных). В таймере проверять, если события отправки не происходит некоторое время - связь оборвана.

                            Сейчас попробую порыть
                              Цитата Fr0sT @
                              А еще можно проверять результат Send,

                              Именно это я предлагаю делать:
                              Цитата medved_68 @
                              то что мешает периодически (по таймеру) отправлять что то? И анализировать, сколько байт отправлено...

                              :D Но, видимо, как то не так предлагаю... :lol: А 20 сек. для сети - это ерунда, можно смело забить. Весь вопрос в том, предусмотрена ли буферизация отправляемых пакетов пользовательским протоколом, чтобы можно было повторить отправку при восстановлении канала и без потерь данных. :D

                              Добавлено
                              Цитата Fr0sT @
                              Он же про удаленный порт (входящий на девайсе) говорит, а не локальный (исходящий на компе)

                              Неужели? :huh: :blink:
                              Цитата apprentice @
                              Да нет они на одном порту висят но один в потоке, а второй просто висит.

                              Весьма трудно ClientSocket представить на удаленном девайсе в контексте процитированного. :D
                                Цитата medved_68 @
                                Неужели?

                                Ну, я понял эту фразу как "Они к одному порту присоединены", поскольку локальный порт в контексте задачи тут вообще не пришей кобыле хвост.

                                Добавлено
                                Цитата medved_68 @
                                20 сек. для сети - это ерунда, можно смело забить

                                Ага, особенно в realtime приложениях :lool:
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0922 ]   [ 15 queries used ]   [ Generated: 24.10.26, 03:05 GMT ]