Я использую Epoll построить сервер, это код, в котором я инициализации Epoll:Unix: Epoll, поймать Ctrl + d и CTRL + C в сервере
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 не уходит, но мой битф ield равно 2001 тоже ...
После ctrl + d мой сервер закрывает сокет. Это не нормально ... Ctrl + D не должен закрывать сокет и возвращать другое битовое поле.
Как узнать, на сервере, если это ctrl + c или ctrl + d?
спасибо.
Я не знаю, как увидеть версию Netcat (без опции --version) Но я вижу в человеке: > Соединение может быть прекращено с помощью EOF («^ D»). Итак, это нормально? Разница между ctrl + c и ctrl + d заключается в том, что netcat ждет входящих данных при возникновении ctrl + d и закрывает сокет как ctrl + c? –
Похоже, это так, да. – Celada
Вы можете использовать telnet вместо netcat. Он отправляет символ^D (0x04) для Ctrl-D. –