Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > epoll() на клиенте и сервере.


Автор: boostcoder 18.10.2010, 09:03
всем привет.
интересует такой вопрос..
сервер мониторит дескрипторы сокетов на предмет изменения их состояния со стороны клиента.
я вот о чем подумал: допустим, мне нужно чтоб клиент, так же, асинхронно, как и сервер, мог мониторить их на предмет изменения их состояния со стороны сервера. т.е. чтоб оба участника сессии могли одновременно быть и ведущими и ведомыми.
такое возможно?

спасибо.

Автор: MAKCim 18.10.2010, 09:21
если сервер сам сообщает каждому клиенту о том, что остальные клиенты (сокеты) изменили свое состояние
для этого, видимо, клиент должен открыть два соединения с сервером: одно обычное, второе - для мониторинга

это если я правильно понял суть ;)

Автор: boostcoder 18.10.2010, 09:59
Цитата(MAKCim @  18.10.2010,  09:21 Найти цитируемый пост)
если сервер сам сообщает каждому клиенту о том, что остальные клиенты (сокеты) изменили свое состояние

как бы да... но уточню.
хотелось бы сделать так, чтоб клиент мог мониторить дескриптор.
вроди бы мы поняли друг-друга...

если я вас правильно понял, то клиент по одному соединению общается с сервером обычным образом, а второе использует так же как и сервер, для мониторинга, так?

Автор: MAKCim 18.10.2010, 11:20
по первому соединению "общаемся" по протоколу
по второму получаем от сервера информацию о других клиентах
как-то так

Автор: boostcoder 18.10.2010, 11:24
запутали.
поясню: хочу сделать так, чтоб клиент, так же как и сервер, мог определять изменение на сокете. т.е. чтоб оба были инициаторами сессии.
клиент постучал на сервер, переключился в режим прослушивания сокета, сервер ответил, клиент получил событие изменения состояния сокета, и т.д..

не знаю как еще это объяснить..

Автор: MAKCim 18.10.2010, 11:42
Цитата(boostcoder @  18.10.2010,  11:24 Найти цитируемый пост)
клиент постучал на сервер

connect() со стороны клиента

Цитата(boostcoder @  18.10.2010,  11:24 Найти цитируемый пост)
переключился в режим прослушивания сокета,

вот здесь не понял
то ли имеется в виду listen(), то ли добавление в epoll для получения ивэнтов...


Автор: boostcoder 18.10.2010, 11:47
Цитата(MAKCim @  18.10.2010,  11:42 Найти цитируемый пост)
вот здесь не понял
то ли имеется в виду listen(), то ли добавление в epoll для получения ивэнтов...

в этом то и вопрос. как реализовать задумку? чтоб клиент не тупо ожидал заранее известного ему события(чтения/записи). а слушал сокет на предмет появления на нем событий.

Добавлено через 1 минуту и 58 секунд
мне тут подсказывают, что наверняка мне нужен бэкконнект.. пошел в гугл..

Добавлено через 4 минуты и 52 секунды
бэкконнект - позволяет подключаться к юзеру за натом. это не то.
у меня юзер сам подключается к серверу.

Автор: MAKCim 18.10.2010, 12:02
чет я все равно не догоняю, что надо smile
разбираемся
listen() надо для того, чтобы сделать сокет прослушивающимся, т. е. чтобы _получать_ новые коннекты
еще раз, после конеекта от клиента к серверу что должен делать клиент? т. е. какая и о чем ему нужна информация?

Автор: mes 18.10.2010, 12:04
Цитата(boostcoder @  18.10.2010,  10:47 Найти цитируемый пост)
чтоб клиент не тупо ожидал заранее известного ему события(чтения/записи). а слушал сокет на предмет появления на нем событий.

 smile 
случаев взаимодействия всего два : 
1. постоянно слушать  - т.е опрос состояния
2. ждать события -  тот же колбяк

что Вам нужно не понятно .. 


Автор: xvr 18.10.2010, 14:40
Насколько я понял из туманных вопросов ТС, он хочет использовать epoll на обоих сторонах сокета (на сервере и у клиента). Это вполне возможно, epoll'у глубоко фиолетово, кто к кому подключался (если конечно от него хотят не мониторинг именно подключения). Собственно обмен данными (чтение/запись) в сокетах абсолютно симметричны, как со стороны сервера, так и со стороны клиента.

Автор: boostcoder 18.10.2010, 14:46
Цитата(xvr @  18.10.2010,  14:40 Найти цитируемый пост)
он хочет использовать epoll на обоих сторонах сокета (на сервере и у клиента). Это вполне возможно, epoll'у глубоко фиолетово, кто к кому подключался (если конечно от него хотят не мониторинг именно подключения). Собственно обмен данными (чтение/запись) в сокетах абсолютно симметричны, как со стороны сервера, так и со стороны клиента.

именно!
я вроде так и объяснил..

Автор: MAKCim 18.10.2010, 16:09
boostcoder
плин
с моей т. з. это очевидно и в эту сторону я даже не думал...

epoll'у в принципе все равно, что в него засовывают
лишь бы объект был валиден и поддерживал poll

Автор: boostcoder 18.10.2010, 16:24
Цитата(MAKCim @ 18.10.2010,  16:09)
boostcoder
плин
с моей т. з. это очевидно и в эту сторону я даже не думал...

epoll'у в принципе все равно, что в него засовывают
лишь бы объект был валиден и поддерживал poll

все, понял.
прежде чем код писать, хотел убедится что это возможно с теоретической т.з.
мне казалось, что epoll() привилегия только одной из сторон в сессии.

всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)