我使用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?
谢谢。
ctrl + c和ctrl + d不能直接被服务器“看到”。它们分别导致SIGINT信号发送到netcat,netcat在其stdin上看到EOF条件。 netcat所做的工作实际上取决于netcat,而不取决于您的服务器。这是他们为我做的事情:
ctrl + EPOLLIN|EPOLLRDHUP
条件一致。如果阅读套接字,您会发现EOF正在等待您。
[[[ctrl + d会在netcat的stdin上发送EOF:netcat注意到EOF。它不会通过套接字发送更多数据。但是,如果服务器还有更多数据要发送,它将继续运行并从套接字读取。
换句话说,我无法重现您所看到的netcat行为(使用Linux 2.6和netcat v1.10-38)。也许您的netcat版本在读取stdin上的EOF之后关闭了套接字以进行写入?