- можно ли подать команду потоку ?, 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-е когда что нибудь придет на сокет. и ждал бы он так вечно если б не таймаут. но и таймаут таймауту рознь: с одной стороны очень часто проверять не следует (траффик то не бесплатный), а с другой стороны надо сразу узнать что соединение оборвалось. Уточню еще: сервак читает мало и относительно редко, и таймауты относительно этого большие. вот и страшно потерять соединение во время таймаута. Понятно что если б я читал из сокета гигабайт-другой то сразу б обнаружил обрыв связи.... но! увы и ах! в основном то я не читаю данные, а жду когда они придут.
|