либвент и неблокирующие розетки - PullRequest
5 голосов
/ 05 июня 2011

Я понимаю, что для мониторинга сокета с использованием libevent сначала необходимо вызвать event_set() с правильными параметрами.

В документации libevent говорится, что параметром event для event_set () может быть либо EV_READ, либо EV_WRITE.И что этот параметр события является событием, которое нужно искать.

Но каким событиям сокета соответствуют EV_READ и EV_WRITE?Я имею в виду, как я буду отслеживать изменения состояния соединения по сравнению с мониторингом входящих сообщений?

1 Ответ

3 голосов
/ 29 августа 2011

Я нашел этот сайт с точки зрения документации для libevent.На странице, посвященной событиям , есть хороший обзор того, что на самом деле означают различные флаги событий.По этой ссылке:

  • EV_READ : этот флаг указывает на событие, которое становится активным, когда предоставленный дескриптор файла готов к чтению.

  • EV_WRITE : Этот флаг указывает на событие, которое становится активным, когда предоставленный дескриптор файла готов к записи.

  • EV_SIGNAL : используется для обнаружения сигнала.

  • EV_PERSIST : указывает на то, что событие является постоянным.

  • EV_ET : Указывает, что событие должно инициироваться ребром, если базовый бэкэнд event_base поддерживает события, инициируемые ребром.Это влияет на семантику EV_READ и EV_WRITE.

Итак, чтобы ответить на ваш вопрос явно: EV_READ соответствует наличию данных, доступных для чтения из сокета или bufferevent, которые являются libeventсокетные эквиваленты, насколько я могу судить.EV_WRITE соответствует сокету / bufferevent, готовому к записи данных в него.Вы можете установить обратные вызовы чтения / записи, чтобы фактически выполнять чтение и запись данных с аргументом cb равным

struct event *event_new(struct event_base *base, evutil_socket_t fd, short what, event_callback_fn cb, void *arg);

Если вы выполняете IO сокетов с libevent, то выВозможно, вы захотите использовать буферные события - это то, что я использую в одном из моих проектов, snot_mon, , который вы можете проверить на github .

...