The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"можно ли подать команду потоку ?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"можно ли подать команду потоку ?" 
Сообщение от Savva emailИскать по авторуВ закладки(ok) on 29-Июн-05, 11:46  (MSK)
есть сетевое приложение на ЦЕ. Каждого клиента обрабатывает отдельный поток(на данный момент потоки отсоединенные).

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

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "можно ли подать команду потоку ?" 
Сообщение от Savva emailИскать по авторуВ закладки(ok) on 29-Июн-05, 14:18  (MSK)
>Я думаю, что лучше бы поток сам по себе проверял соединение, есть такая
> вещь как keep alive.

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


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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "можно ли подать команду потоку ?" 
Сообщение от Savva emailИскать по авторуВ закладки(ok) on 29-Июн-05, 17:49  (MSK)
а вот причудилось мне следующее сильное колдунство:

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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


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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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