#c #linux #network-programming #epoll
Вопрос:
Я создаю события Epoll, устанавливаю индекс в структуре epoll пользовательских данных epoll_data
и добавляю их в Epoll. Однако при получении вызова от Epoll этот индекс пользовательских данных неинициализирован.
Код:
class Epoll
{
Epoll()
{
_epollFd = epoll_create1(0);
assert(_epollFd >= 0);
}
void addEvent()
{
struct epoll_event event;
event.events = EPOLLIN;
event.data.u32 = getIndexFromSomwhere(); // This is set with/prints 0
int sock = getSockFromSomewhere();
assert(epoll_ctl(_epollFd, EPOLL_CTL_ADD, sock, amp;event));
}
void receiveEvents()
{
while(true)
{
struct epoll_event events[MAX_SOCKETS];
const size_t count = epoll_wait(_epollFd, amp;events[0], sizeof(events), -1);
for(size_t j = 0; j < count; j)
{
const uint32_t callbackIndex = events[j].data.u32;
// This returns 32735, not 0 as expected
}
}
}
int _epollFd;
};
Комментарии:
1. 3-й параметр
epoll_wait()
ожидает количество элементов, а не количество байтов. ИспользуйтеMAX_SOCKETS
вместоsizeof(events)
. Кроме того, возвращаемое значениеepoll_wait()
является подписаннымint
, а не неподписаннымsize_t
. таким образом, ваш цикл будет введен неправильно, еслиepoll_wait()
вернется-1
при сбое.