![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
Собно есть в Линухе такое семейство функций под общим названием epoll. Чтобы не растекаться мыслями по древу приведу исходный код из man'a:
Вроде бы все чинно, лоично и понятно.. Но вот в упор не пойму зачем epoll_data_t был объявлен как union? Ведь кроме файлового декскритора там особо ничего и не насохраняешь.. Если даже сохранить какойнить полезный указатель в тот-же void *ptr; заботливо припасенный в юнионе, - то мы затрем дескриптор файла, а он ведь тоже нужен. Посему нужно будет скопировать дескритор в другую перемнную... НУ НЕ ПОНИМАЮ Я ЭТОГО!! ![]() З.Ы. А круто было бы, если бы вместо union'a это был struct. Много полезной инфы можно было бы напихать туда - удобно, все в одном месте. Хотя, сдается мне, что такой подход был бы череват перерасходом памяти.. -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
потому что в реальном коде все ассоциированные с дексриптором данные хранят в структуре. а ее адрес и присваивают ptr`у ![]() |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
выходит это так сделано для удобства системы?
![]() ![]() ![]() ![]() -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
для удобства использующего ее программиста ;) |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
А можешь показать в чем заключается это удобство? а то я не совсем понимаю.. лично мне от этого юниона ни тепло ни холодно
-------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
ну вот представь: у тебя есть набор подключившихся пользователей. ты мониторишь набор дескрипторов в ожидании событий от юзеров.
где ты будешь хранить информацию о сессии(состояние игры, транзакцию действий) пользователя? и как ты имея только дескриптор, поймешь, какого_пользователя_этот_дестриптор? |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
Создаем массив, который будет являть соответствие конкретного дескриптора и с указателем на некую структуру в которой хранится информация о состоянии дел пользователя (который подключился к серверу с использованием этого дескриптора) или как ты выразился о сессии.
а поскольку мы знаем что дескриторы это не случайное число, а имеет тенденцию к возрастанию и теоретически имеет верхний предел, то можно сделать так:
опять же повторюсь, union может хранить в себе только ОДНО значение т.е. ИЛИ fd ИЛИ *ptr но не как ни соответствие fd <-->*ptr для этиго вышеупомянутый epoll_data_t должен был бы быть объявлен как struct - тогда пожалуйста. ну или я действительно чего-то не понимаю ![]() -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: нет Всего: 5 |
ptr будет указывать на структуру в которую мы сперва скопируем этот fd, а потом уже поменяем значение ptr. т.е. если нужен только дескриптор файла, пожалуйста, если нужна целая структура, делайте как хотите и помещайте указатель на нее в ptr. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
всего один вопрос: зачем? |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
Т.е. достаточно будет только раз этот *ptr туда прописать и он нам вернется из epoll_wait в юниионе. Мы будем точно знать что на этой сесси произошло некое событие. Теперь понял ![]() boostcoder, Опытом не умудрен потому и склонен к изобретению лисапетов ![]() З.Ы. ну не встречал я раньше таких приемов программирования Это сообщение отредактировал(а) shara - 28.7.2011, 10:39 -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |