Проблема с закрытием клиентских сокетов со стороны сервера

#c #sockets #tcp #epoll

Вопрос:

В настоящее время я работаю над http-проектом веб-сервера. Я кое-что заметил в своем стресс-тесте на осаду, когда остановил его с помощью ctrl c. Я использую Epoll для мультиплексирования.

  1. Клиентский сокет (допустим, fd = 6), для которого я получил события EPOLLIN через epoll, возвращает 0 после recv.
  2. Когда это происходит, я закрываю клиентский носок (6), считая, что что-то пошло не так.
  3. После этого я столкнулся с проблемами с новыми запросами на сервере сокетов (допустим, fd = 5), связанными с предыдущим клиентом сокета (6).
  4. Если я получу запрос на него, я приму новое соединение и получу новый клиентский носок (скажем, 7, но это может быть 6, так как я закрыл предыдущий).
  5. Я установлю и получу ЭПОЛЛИН события на клиентском носке 7. Я прочитаю, что в нем, и найду старый запрос от осады.
  6. Я отвечу на этот запрос, но при отправке получу сигнал broken_pipe.
  7. Сервер сокетов (5) не сможет принимать никаких других запросов.

Похоже, это может быть связано с SIGPIPE, мы его SIG_IGN, но он все равно не работает. Похоже, розетка сломана.

Есть ли у кого — нибудь представление о том, что происходит ?

Я готов предоставить любую другую информацию, которую я могу забыть.

Спасибо

Комментарии:

1. Можете ли вы предоставить исходный код программы минимального размера, которая воспроизводит ошибку? Похоже, что в коде есть ошибка, но без возможности увидеть код (или, еще лучше, скомпилировать его, запустить и понаблюдать за его поведением) маловероятно, что кто-нибудь сможет понять, что не так.

2. Кстати, я надеюсь, что вы удаляете сокет fd=6 из своего набора сокетов epoll (через EPOLL_CTL_DEL ) перед закрытием сокета? Если оставить epoll (), пытаясь использовать закрытый сокет, это сделает epoll() несчастным :/

3. Я благодарю вас за ваши комментарии и интерес ! Итак, мы нашли проблему, и она исходила от ЭПОЛЛЕТА. Удаление EPOLLET для сервера socker 5 решит проблему. Я не уверен, почему. Вы прямо рядом, я предоставлю больше кода. Спасибо!