The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
можно ли подать команду потоку ?, !*! Savva, 29-Июн-05, 11:46  [смотреть все]
есть сетевое приложение на ЦЕ. Каждого клиента обрабатывает отдельный поток(на данный момент потоки отсоединенные).

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

Реально ли дать потоку команду и получить ответ? Какими путями?

  • можно ли подать команду потоку ?, !*! Vladislav Lazarenko, 13:57 , 29-Июн-05 (1)
    >есть сетевое приложение на ЦЕ. Каждого клиента обрабатывает отдельный поток(на данный момент
    >потоки отсоединенные).
    >
    >требуется каким либо образом указать потоку что б он проверил свое соединение
    >(отвечают ли ему на другом конце открытого сокета) и соответствующе ответил
    >основному потоку.
    >
    >Реально ли дать потоку команду и получить ответ? Какими путями?

    Вполне реально, но попахивает плохим дизайном. Я думаю, что лучше бы поток сам по себе проверял соединение, есть такая вещь как keep alive. Можно задавать интервал пингов в конфиге and so force. Ещё одна интересная мысль, если у вас поток - "читатель", то соединение "отвалится" само собой, если на той стороне закроют сокет. Если же он писатель, то достаточно написать метод класса, который будет пинговать, и синхронизировать доступ к соединению, используя блокировку. Но, если все же вы хотите так, как описали выше (плохо понятно зачем), то можно использовать несколько способов, вот некоторые из них, которые я знаю:

    1) Послать сигнал потоку, что он должен проверить соединение.
    2) Использовать семафор, который будет ему сигнализировать.

    • можно ли подать команду потоку ?, !*! Savva, 14:18 , 29-Июн-05 (2)
      >Я думаю, что лучше бы поток сам по себе проверял соединение, есть такая
      > вещь как keep alive.

      да таймауты есть. но предпологается что сервер только принимает пакеты от клиента и отвечает на них (вобщем пассивный такой сервер получается). Клиент раз в минуту сообщает о своем существовании и активности. Вот и возникла такая ситуёвина: если клиент скажет о том что он жив и сразу же отвалится (не нормальным образом). Далее клиент снова попытается установить соединение с сервером, но на сервере должен быть только один клиент с номером 1 (ну требуется знать что клиент номер 1 жив и с ним все впорядке, а так получится что один поток будет орать клиент помер, а другой что он жив).
      Вот собственно и требуется из главного потока попросить проверить как там дела у дочернего который по идее все еще обслуживает первого клиента, но в то же время в очереди на присоединение сново стоит этот же клиент номер 1.


      >1) Послать сигнал потоку, что он должен проверить соединение.
      >2) Использовать семафор, который будет ему сигнализировать.

      а по подробней нельзя? (примерчик, ссылочку)

      ну или хотя бы ключевые слова по которым гуглить :)

      • можно ли подать команду потоку ?, !*! Vladislav Lazarenko, 14:25 , 29-Июн-05 (3)
        >>Я думаю, что лучше бы поток сам по себе проверял соединение, есть такая
        >> вещь как keep alive.
        >
        >да таймауты есть. но предпологается что сервер только принимает пакеты от клиента
        >и отвечает на них (вобщем пассивный такой сервер получается). Клиент раз
        >в минуту сообщает о своем существовании и активности. Вот и возникла
        >такая ситуёвина: если клиент скажет о том что он жив и
        >сразу же отвалится (не нормальным образом). Далее клиент снова попытается установить
        >соединение с сервером, но на сервере должен быть только один клиент
        >с номером 1 (ну требуется знать что клиент номер 1 жив
        >и с ним все впорядке, а так получится что один поток
        >будет орать клиент помер, а другой что он жив).
        >Вот собственно и требуется из главного потока попросить проверить как там дела
        >у дочернего который по идее все еще обслуживает первого клиента, но
        >в то же время в очереди на присоединение сново стоит этот
        >же клиент номер 1.
        >
        >
        >>1) Послать сигнал потоку, что он должен проверить соединение.
        >>2) Использовать семафор, который будет ему сигнализировать.
        >
        >а по подробней нельзя? (примерчик, ссылочку)
        >
        >ну или хотя бы ключевые слова по которым гуглить :)

        По поводу семафоров и сигналов потокам читай "Programming with POSIX threads". Слова: semaphore, signals and so force.

        • можно ли подать команду потоку ?, !*! Savva, 17:49 , 29-Июн-05 (4)
          а вот причудилось мне следующее сильное колдунство:

          в потоке обслуживающем клиента имеется select который ожидает данных от клиента и смотрит не пора ли бить тревогу по таймауту... так воооот а нельзя ли создать какой нить дескриптор за изменением которого тот же select бы приглядывал. и соответственно когда потребуется из главного потока менять его.

          лихо загнул :) ?

          быть может конечно сказал глупость, но это все от непонимания что есть дескриптор и как select смотрит за его изменением. Но думаю можно ведь его съэмулировать и потом вручную менять его состояние.

          какие будут мысли по поводу этого колдунства?

          • можно ли подать команду потоку ?, !*! Vladislav Lazarenko, 17:53 , 29-Июн-05 (5)
            >а вот причудилось мне следующее сильное колдунство:
            >
            >в потоке обслуживающем клиента имеется select который ожидает данных от клиента и
            >смотрит не пора ли бить тревогу по таймауту... так воооот а
            >нельзя ли создать какой нить дескриптор за изменением которого тот же
            >select бы приглядывал. и соответственно когда потребуется из главного потока менять
            >его.
            >
            >лихо загнул :) ?
            >
            >быть может конечно сказал глупость, но это все от непонимания что есть
            >дескриптор и как select смотрит за его изменением. Но думаю можно
            >ведь его съэмулировать и потом вручную менять его состояние.
            >
            >какие будут мысли по поводу этого колдунства?

            Определись с тем, что ты хочешь, если на той стороне отвалится клиент - твой поток сразу об этом узнает. Если же ты должен получать какие данные с интервалом, то делай select на дескрипторе с нужным таймаутом.

            Все остальное, типа дополнительных дескрипторов тебе лезет в голову от незнания и неопытности. Если что-то не знаешь, обязательно надо придумать свой велосипед, который будет галимый, но зато ты будешь его понимать, не так ли?

            • можно ли подать команду потоку ?, !*! Savva, 09:47 , 30-Июн-05 (6)
              >Определись с тем, что ты хочешь, если на той стороне отвалится клиент
              >- твой поток сразу об этом узнает.
              > Если же ты должен
              >получать какие данные с интервалом, то делай select на дескрипторе с
              >нужным таймаутом.

              Требуется раз в пять минут проверить связь с удаленной стороной (клиент посылает на сервер маааленький пакетик). Делаю select с таймаутом в 5 минут, если данные пришли, то все нормально. Если за 5 минут ничего не было то бъем тревогу.
              Так вот если в течении этих 5ти минут когда мы тупо ждем данных в селекте, взять и просто выдернуть из сетевухи кабель (минутки на 3), то сервак все эти 3 минуты будт думать что все нормально.

              Потом втыкаем этот кабель обратно... клиент допустим уже понял что соединение оборвано и пытается установить соединение снова. Но! сервер то по прежнему считает что соединение установленно и продолжает досчитывать свои 5 минут.
              А надо как то этому потоку намекнуть, что неплохо бы внеочередной раз проверить соединение и если оно потеряно то установить с клиентом новый канал связи.

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

              • можно ли подать команду потоку ?, !*! Vladislav Lazarenko, 11:17 , 30-Июн-05 (7)
                >>Определись с тем, что ты хочешь, если на той стороне отвалится клиент
                >>- твой поток сразу об этом узнает.
                >> Если же ты должен
                >>получать какие данные с интервалом, то делай select на дескрипторе с
                >>нужным таймаутом.
                >
                >Требуется раз в пять минут проверить связь с удаленной стороной (клиент посылает
                >на сервер маааленький пакетик). Делаю select с таймаутом в 5 минут,
                >если данные пришли, то все нормально. Если за 5 минут ничего
                >не было то бъем тревогу.
                >Так вот если в течении этих 5ти минут когда мы тупо ждем
                >данных в селекте, взять и просто выдернуть из сетевухи кабель (минутки
                >на 3), то сервак все эти 3 минуты будт думать что
                >все нормально.
                >
                >Потом втыкаем этот кабель обратно... клиент допустим уже понял что соединение оборвано
                >и пытается установить соединение снова. Но! сервер то по прежнему считает
                >что соединение установленно и продолжает досчитывать свои 5 минут.
                >А надо как то этому потоку намекнуть, что неплохо бы внеочередной раз
                >проверить соединение и если оно потеряно то установить с клиентом новый
                >канал связи.
                >
                >вот она и проблема: мой поток может сразу и не узнать о
                >том что клиент отвалился, а будет тупо отсчитывать время находясь в
                >селекте.

                Если клиент поймет что соединение оборвано, то сервер это уже будет знать наверняка. Я так понял - это у тебя теория? Почитай книгу Unix Network Programming.

                • можно ли подать команду потоку ?, !*! Savva, 11:44 , 30-Июн-05 (8)
                  >Если клиент поймет что соединение оборвано, то сервер это уже будет знать
                  >наверняка.
                  если соединение будет разорвано не нормально, то сервак ничего не узнает до ближайшей попытки что нибудь передать в сокет (ну или по выставленному таймауту TCP_KEEPINDLE+(TCP_KEEPINTVL * TCP_KEEPCNT) )


                  > Я так понял - это у тебя теория?
                  кабель из сетевухи выдергивал... сервак ничего не заметил

                  > Почитай книгу Unix Network Programming.
                  читаю Стивенса

                  • можно ли подать команду потоку ?, !*! Vladislav Lazarenko, 11:52 , 30-Июн-05 (9)
                    >>Если клиент поймет что соединение оборвано, то сервер это уже будет знать
                    >>наверняка.
                    >если соединение будет разорвано не нормально, то сервак ничего не узнает до
                    >ближайшей попытки что нибудь передать в сокет (ну или по выставленному
                    >таймауту TCP_KEEPINDLE+(TCP_KEEPINTVL * TCP_KEEPCNT) )
                    >

                    М.ммм.. передать? Ты же читаешь, у меня "читатель" отваливается четко, если что-то не так. А по поводу выдергивания - так на то она и сеть, чтобы быть устойчивой, вот и надеемся, что кабель снова всунут и все будет ок. Но если ты его всунешь, а на той стороне клиент уже поймет, что соединения нет, то сервер тоже об этом узнает. Как то странно ты написал)

                    >
                    >> Я так понял - это у тебя теория?
                    >кабель из сетевухи выдергивал... сервак ничего не заметил
                    >
                    >> Почитай книгу Unix Network Programming.
                    >читаю Стивенса
                    Маладца! )

                    • можно ли подать команду потоку ?, !*! Savva, 12:22 , 30-Июн-05 (10)
                      >>если соединение будет разорвано не нормально, то сервак ничего не узнает до
                      >>ближайшей попытки что нибудь передать в сокет (ну или по выставленному
                      >>таймауту TCP_KEEPINDLE+(TCP_KEEPINTVL * TCP_KEEPCNT) )
                      >>
                      >
                      >М.ммм.. передать? Ты же читаешь, у меня "читатель" отваливается четко, если что-то не так.

                      Да сервак у меня именно читает. вернее ждет в SELECT-е когда что нибудь придет на сокет. и ждал бы он так вечно если б не таймаут. но и таймаут таймауту рознь: с одной стороны очень часто проверять не следует (траффик то не бесплатный), а с другой стороны надо сразу узнать что соединение оборвалось.

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру