#c #sockets #tcp #epoll
Вопрос:
В настоящее время я работаю над http-проектом веб-сервера. Я кое-что заметил в своем стресс-тесте на осаду, когда остановил его с помощью ctrl c. Я использую Epoll для мультиплексирования.
- Клиентский сокет (допустим, fd = 6), для которого я получил события EPOLLIN через epoll, возвращает 0 после recv.
- Когда это происходит, я закрываю клиентский носок (6), считая, что что-то пошло не так.
- После этого я столкнулся с проблемами с новыми запросами на сервере сокетов (допустим, fd = 5), связанными с предыдущим клиентом сокета (6).
- Если я получу запрос на него, я приму новое соединение и получу новый клиентский носок (скажем, 7, но это может быть 6, так как я закрыл предыдущий).
- Я установлю и получу ЭПОЛЛИН события на клиентском носке 7. Я прочитаю, что в нем, и найду старый запрос от осады.
- Я отвечу на этот запрос, но при отправке получу сигнал broken_pipe.
- Сервер сокетов (5) не сможет принимать никаких других запросов.
Похоже, это может быть связано с SIGPIPE, мы его SIG_IGN, но он все равно не работает. Похоже, розетка сломана.
Есть ли у кого — нибудь представление о том, что происходит ?
Я готов предоставить любую другую информацию, которую я могу забыть.
Спасибо
Комментарии:
1. Можете ли вы предоставить исходный код программы минимального размера, которая воспроизводит ошибку? Похоже, что в коде есть ошибка, но без возможности увидеть код (или, еще лучше, скомпилировать его, запустить и понаблюдать за его поведением) маловероятно, что кто-нибудь сможет понять, что не так.
2. Кстати, я надеюсь, что вы удаляете сокет fd=6 из своего набора сокетов epoll (через
EPOLL_CTL_DEL
) перед закрытием сокета? Если оставить epoll (), пытаясь использовать закрытый сокет, это сделает epoll() несчастным :/3. Я благодарю вас за ваши комментарии и интерес ! Итак, мы нашли проблему, и она исходила от ЭПОЛЛЕТА. Удаление EPOLLET для сервера socker 5 решит проблему. Я не уверен, почему. Вы прямо рядом, я предоставлю больше кода. Спасибо!