我正在尝试用epoll设置一个基本服务器来处理多个客户端。然而,变量socket
(第20行(的值在第一次迭代中等于0
,但它应该是3
(accept
套接字(。
事件注册良好,但套接字值为0
。我尝试使用不同的标志(EPOLLIN
、EPOLLOUT
(,但没有任何变化。
以下是主要功能:
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.