我使用 epoll 构建服务器,这是我初始化 epoll 的代码:
core->fd_epoll = epoll_create(LIMIT_CLIENT);
ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
ev.data.fd = core->socket_main;
epoll_ctl(core->fd_epoll, EPOLL_CTL_ADD, core->socket_main, &ev);
while (1)
{
nfds = epoll_wait(core->fd_epoll, &ev, 90000, -1);
...
}
当我用它来检查我的 fds 上是否有新东西时:
for (i = 0; i < nfds; i++)
{
fd = ev[i].data.fd;
if (fd == core->socket_main)
{
socket_fils = socket_accept(core->socket_main, 0);
event.data.fd = socket_fils;
event.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
xepoll_ctl(core->fd_epoll, EPOLL_CTL_ADD, socket_fils, &event);
printf("Incoming => FD fils %d\n", socket_fils);
}
else
printf("Event %x\n", ev[i].events);
}
当我使用 netcat 向服务器发送消息时,位域事件等于 1 (EPOLLIN) 当我发送 ctrl+c 时,netcat 退出并且我的位域等于 2001 (EPOLLIN 和 EPOLLRDHUP) 当我发送 ctrl+d ,netcat 没有退出,但我的位域也等于 2001 ......
在 ctrl+d 之后,我的服务器关闭了套接字。这不正常... ctrl+d 不应该关闭套接字并返回不同的位域。
在服务器中,我怎么知道它是 ctrl+c 还是 ctrl+d ?
谢谢你。