@tmp_ilya1

Почему поле fd в событии epoll_event не задано?

Здравствуйте!

У меня после того как метод epoll_wait получает событие EPOLLIN, поле структуры epoll_event.data.fd выставлено в 0, хотя в документации сказано, что там должен быть дескриптор клиентского сокета (кстати поле epoll_event.data.ptr при этом заполнено корректно).

int n = epoll_wait(epoll_fd, events, maxEvents, -1);
for (int i = 0; i < n; i++)
{
epoll_event e = events[i];
int s = e.data.fd;   <---- всегда 0
}


Код для входящего сокета:
int cfd = accept4(sfd, null, null, SOCK_NONBLOCK);

epoll_event e;
e.events = EPOLLIN;
e.data.fd = cfd;
e.data.ptr = (void*)cfd;
epoll_ctl(efd, EPOLL_CTL_ADD, cfd, &e);


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

Код для серверного сокета:
epoll_event se;
se.data.fd = sfd;
se.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sfd, &se);
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
e.data.fd = cfd;
e.data.ptr = (void*)cfd;


epoll_data -- это union, не нужно его инициализировать сначала одним, а потом другим:
typedef union epoll_data {
               void    *ptr;
               int      fd;
               uint32_t u32;
               uint64_t u64;
           } epoll_data_t;

           struct epoll_event {
               uint32_t     events;    /* Epoll events */
               epoll_data_t data;      /* User data variable */
           };


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

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

Кроме того, 0 -- вполне нормальный файловый дескриптор.
Короче, я попробовал, у меня работает. Если у тебя не работает -- приведи весь код.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы