|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.02.2018, 00:51 | #1 |
Пользователь
Регистрация: 10.04.2017
Сообщений: 66
|
Не коректное закрытие сокетов
Здравствуйте. Сижу уже 5-ый час, пытаюсь понять в чем проблема. Что бы было понятно объясню... Класс сервер создает поток обрабатывающий события и закрывающий сокеты по таймеру. Главный поток инициализирует потоки обрабатывающие сетевые события и потоки обработчики http/ws событий. main поток добавляет событие в очередь workera. Тот в свою очередь либо ждет дополнительных данных, либо возвращает ошибку (некорректный запрос), либо добавляет запрос в очередь для пользовательского обработчика. По задумке сервер должен компилироваться с сайтом сразу и поэтому пользовательские обработчики должны быть незвасимыми и обрабатывать конкретную функцию пользователя. Что бы у пользователя (который пишет сайт) не было проблем с подключениями к БД, memcached-у или ещё чему то, в функцию передается номер потока обработчика (пока не доделано, но это не важно). Проблема в том, что после того как я пытаюсь отправить ошибку (не существующий домен) epoll не возвращает события больше. Я открываю файл где отправляется 3 запроса на сервер, после 2 обновления страницы новые запросы не приходят, события закрытия старых не появляется и сокет просто висит.
Объясните, пожалуйста, что не так. (проект не учебный, помощь нужна не для учебы) Заранее огромнейшее спасибо! |
17.02.2018, 09:27 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Вы упорно считаете, что можно работать с коллекциями из разных потоков без всякой синхронизации.
После каждого accept вы добавляете в epoll что может сразу разбудить рабочий поток, только сокет еще не добавлен в connections... Использование EPOLLET подразумевает вычитывание всех данных, прежде чем получите новый сигнал. То, что сокет вернет 0 байт доступных еще не значит, что из сокета нельзя читать. Далее, между FIONREAD и считыванием количество может измениться. Про качество кода и дизайна я вообще промолчу. Последний раз редактировалось waleri; 17.02.2018 в 09:50. |
20.02.2018, 16:31 | #3 | |
Пользователь
Регистрация: 10.04.2017
Сообщений: 66
|
Цитата:
Вот пример использования: Код:
|
|
20.02.2018, 18:02 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Уже лучше, но:
а) что будете делать, если надо будет сделать UDPServer? б) использовать обычные функции на С++ - фу... либо std::function, либо виртуальные методы. |
20.02.2018, 20:03 | #5 |
Пользователь
Регистрация: 10.04.2017
Сообщений: 66
|
Обычные функции меня устраивают, а UDP сервер пока не нужен и как я понял (но это не точно), epoll работает с tcp-only. Но даже если нет, то мне это не надо пока. Возникла другая проблема в ходе тестов. Выбрасывались исключения. Я немного переделал код и теперь либо взаимоблокировка, либо epoll не улавливает новые события... Буду благодарен, если подскажете в чем дело. P.S. система ubuntu 17.10, gcc 7.2.0.
|
15.03.2018, 22:53 | #6 |
Новичок
Джуниор
Регистрация: 15.03.2018
Сообщений: 1
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C# программирование сокетов | k0shiki | C# (си шарп) | 5 | 12.10.2017 10:06 |
Шифрование сокетов | Den69 | Visual C++ | 0 | 15.01.2016 18:39 |
Программирование сокетов | adkomissarov | Общие вопросы Delphi | 5 | 03.02.2015 17:53 |
Программирование сокетов | Anubys | C/C++ Сетевое программирование | 5 | 26.11.2011 00:33 |
Организация сокетов | mar4elo | Работа с сетью в Delphi | 1 | 01.01.2009 16:50 |