Unix:Epoll,在服务器中捕获ctrl + d和ctrl + c

问题描述 投票:0回答:1

我使用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?

谢谢。

sockets unix networking epoll
1个回答
3
投票
在运行netcat的终端上按下

ctrl + cctrl + d不能直接被服务器“看到”。它们分别导致SIGINT信号发送到netcat,netcat在其stdin上看到EOF条件。 netcat所做的工作实际上取决于netcat,而不取决于您的服务器。这是他们为我做的事情:

  • ctrl +

  • c
  • 会将SIGINT发送到netcat:netcat被杀死,因为这是SIGINT的默认操作,netcat不会更改它。当netcat死亡时,套接字将自动关闭。服务器将其视为可用的传入数据,与您看到的EPOLLIN|EPOLLRDHUP条件一致。如果阅读套接字,您会发现EOF正在等待您。

    [[[ctrl + d会在netcat的stdin上发送EOF:netcat注意到EOF。它不会通过套接字发送更多数据。但是,如果服务器还有更多数据要发送,它将继续运行并从套接字读取。

换句话说,我无法重现您所看到的netcat行为(使用Linux 2.6和netcat v1.10-38)。也许您的netcat版本在读取stdin上的EOF之后关闭了套接字以进行写入?

© www.soinside.com 2019 - 2024. All rights reserved.