C语言 epoll_wait event.data.fd is always 0



我正在尝试用epoll设置一个基本服务器来处理多个客户端。然而,变量socket(第20行(的值在第一次迭代中等于0,但它应该是3(accept套接字(。

事件注册良好,但套接字值为0。我尝试使用不同的标志(EPOLLINEPOLLOUT(,但没有任何变化。

以下是主要功能:

int main(int argc, char **argv)
{
if (argc != 3)
errx(1, "Usage: ./basic_server SERVER_IP SERVER_PORT");
int cnx = prepare_socket(argv[1], argv[2]);
int epoll_instance = epoll_create1(0);
struct epoll_event event = {};
event.events = EPOLLOUT | EPOLLIN;
struct connection_t *queue = NULL;
if (epoll_ctl(epoll_instance, EPOLL_CTL_ADD, cnx, &event) == -1)
errx(1, "Failed to register server");
while (1)
{
struct epoll_event events[MAX_EVENTS];
int events_count = epoll_wait(epoll_instance, events, MAX_EVENTS, -1);
for (int event_idx = 0; event_idx < events_count; event_idx++)
{
printf("%dn", events[event_idx].data.fd);
int socket = events[event_idx].data.fd;  // line 20
if (socket == cnx)
queue = accept_client(epoll_instance, socket, queue);
else
communicate(socket, queue);
}
}
return 0;
}

struct epoll_event.data字段不会被操作系统触及,它只是与添加到epoll实例中的fd关联,然后在事件发生时按原样返回。如果您希望event.data.fd是正确的文件描述符,那么您必须在调用epoll_ctl:之前设置它

struct epoll_event event = {};
event.data.fd = cnx; // <-- here
event.events = EPOLLOUT | EPOLLIN;
// ...
int events_count = epoll_wait(epoll_instance, events, MAX_EVENTS, -1);
// Now events[event_idx].data.fd == cnx as it should.

最新更新