Как использовать epoll_event data.ptr
Мне все труднее использовать void *ptr в epoll_event. Я могу просто связать это со структурой? Например, я могу сделать что-то подобное? Поскольку я пытаюсь сделать что-то подобное, но это не работает, первый цикл в сокете прослушивания хорош, но после другого события происходит сбой. Может кто-нибудь помочь мне понять, как использовать data.ptr?
struct client {
int fd;
int connection_status;
};
struct epoll_event *events = NULL;
struct epoll_event ev;
struct client *c = new client;
struct client *event_c = NULL;
c.fd = (socket);
int efd = epoll_create1(0);
ev.data.fd = c.fd;
ev.events = EPOLLIN;
ev.data.ptr = c;
epoll_ctl ( efd , EPOLL_CTL_ADD , c.fd , &ev );
events = (struct epoll_event*)calloc ( XXX , sizeof event );
while(1) {
int n = epoll_wait ( efd , events , XXX , -1 );
for ( int i = 0 ; i < n ; i++ ) {
event_c = (struct client*) events[i].data.ptr;
cout << "SOCKET: " << event_c->fd << endl;
if (c->fd == events[i].data.fd ) {
struct client *new_c = new client;
struct epoll_event new_ev;
struct sockaddr inaddr;
sockletn_t in_len;
int nfd = accept ( c->fd , &inaddr , &in_len );
/* make socket non-blocking ... / error checking */
new_c->fd = nfd;
new_c->connection_status = 1;
new_ev.data.fd = nfd;
new_ev.events = EPOLLIN;
new_ev.data.ptr = client;
int r = epoll_ctl ( efd , EPOLL_CTL_ADD , nfd , &new_ev );
continue;
} else {
ssize_t count;
char buf[512];
int count = read ( events[i].data.fd , buf , sizeof buf );
// ... error checking blah blah blah
int rc = write ( 1 , buf , count );
}
}
}
1 ответ
Решение
void *ptr
а также int fd
оба находятся в союзе внутри struct epoll_event
, Вы должны использовать любой из них, а не оба. Следовательно, в вашей структуре добавьте поле для fd
а также и только указатель ссылки на структуру в ptr
поле epoll_event
, Таким образом, когда вы вернете указатель, то получите fd
от него для дальнейшего использования.