Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2018, 00:51   #1
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию Не коректное закрытие сокетов

Здравствуйте. Сижу уже 5-ый час, пытаюсь понять в чем проблема. Что бы было понятно объясню... Класс сервер создает поток обрабатывающий события и закрывающий сокеты по таймеру. Главный поток инициализирует потоки обрабатывающие сетевые события и потоки обработчики http/ws событий. main поток добавляет событие в очередь workera. Тот в свою очередь либо ждет дополнительных данных, либо возвращает ошибку (некорректный запрос), либо добавляет запрос в очередь для пользовательского обработчика. По задумке сервер должен компилироваться с сайтом сразу и поэтому пользовательские обработчики должны быть незвасимыми и обрабатывать конкретную функцию пользователя. Что бы у пользователя (который пишет сайт) не было проблем с подключениями к БД, memcached-у или ещё чему то, в функцию передается номер потока обработчика (пока не доделано, но это не важно). Проблема в том, что после того как я пытаюсь отправить ошибку (не существующий домен) epoll не возвращает события больше. Я открываю файл где отправляется 3 запроса на сервер, после 2 обновления страницы новые запросы не приходят, события закрытия старых не появляется и сокет просто висит.

Объясните, пожалуйста, что не так. (проект не учебный, помощь нужна не для учебы) Заранее огромнейшее спасибо!
Вложения
Тип файла: txt test.txt (19.2 Кб, 148 просмотров)
Андрей Цапко вне форума Ответить с цитированием
Старый 17.02.2018, 09:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Вы упорно считаете, что можно работать с коллекциями из разных потоков без всякой синхронизации.
После каждого accept вы добавляете в epoll что может сразу разбудить рабочий поток, только сокет еще не добавлен в connections...

Использование EPOLLET подразумевает вычитывание всех данных, прежде чем получите новый сигнал.
То, что сокет вернет 0 байт доступных еще не значит, что из сокета нельзя читать.
Далее, между FIONREAD и считыванием количество может измениться.

Про качество кода и дизайна я вообще промолчу.

Последний раз редактировалось waleri; 17.02.2018 в 09:50.
waleri вне форума Ответить с цитированием
Старый 20.02.2018, 16:31   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вы упорно считаете, что можно работать с коллекциями из разных потоков без всякой синхронизации.
После каждого accept вы добавляете в epoll что может сразу разбудить рабочий поток, только сокет еще не добавлен в connections...

Использование EPOLLET подразумевает вычитывание всех данных, прежде чем получите новый сигнал.
То, что сокет вернет 0 байт доступных еще не значит, что из сокета нельзя читать.
Далее, между FIONREAD и считыванием количество может измениться.

Про качество кода и дизайна я вообще промолчу.
Спасибо, вроде исправил ситуацию. Если не сложно не могли бы вы оценить этот код? Вроде бы все работает корректно.

Вот пример использования:
Код:
#include "library/Epoll.class.cpp"

#include <iostream>
#include <string>
using namespace std;

void onmessage_http(const string &message){
	cout<<message<<endl;
}
void onclose_http(){
	//
}

void onaccept_http(TCPServerClient &connect){
	connect.onmessage=onmessage_http;
	connect.onclose=onclose_http;
}


void onmessage_https(const string &message){
	for(int i=0; i<message.size(); i++){
		cout<<(unsigned int)(unsigned char)message[i]<<"\t";
	}
	cout<<endl<<endl<<endl;
}
void onclose_https(){
	//
}

void onaccept_https(TCPServerClient &connect){
	connect.onmessage=onmessage_https;
	connect.onclose=onclose_https;
}

int main(){
	TCPServer http_server;
	http_server.onaccept=onaccept_http;
	http_server.listen("10.0.2.15", 80);

	TCPServer https_server;
	https_server.onaccept=onaccept_https;
	https_server.listen("10.0.2.15", 443);

	Epoll events;
	events.add(http_server);
	events.add(https_server);

	events.loop(1);
}
Заранее спасибо!
Вложения
Тип файла: zip Downloads.zip (4.8 Кб, 23 просмотров)
Андрей Цапко вне форума Ответить с цитированием
Старый 20.02.2018, 18:02   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Уже лучше, но:
а) что будете делать, если надо будет сделать UDPServer?
б) использовать обычные функции на С++ - фу... либо std::function, либо виртуальные методы.
waleri вне форума Ответить с цитированием
Старый 20.02.2018, 20:03   #5
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Уже лучше, но:
а) что будете делать, если надо будет сделать UDPServer?
б) использовать обычные функции на С++ - фу... либо std::function, либо виртуальные методы.
Обычные функции меня устраивают, а UDP сервер пока не нужен и как я понял (но это не точно), epoll работает с tcp-only. Но даже если нет, то мне это не надо пока. Возникла другая проблема в ходе тестов. Выбрасывались исключения. Я немного переделал код и теперь либо взаимоблокировка, либо epoll не улавливает новые события... Буду благодарен, если подскажете в чем дело. P.S. система ubuntu 17.10, gcc 7.2.0.
Вложения
Тип файла: zip server.zip (5.3 Кб, 22 просмотров)
Андрей Цапко вне форума Ответить с цитированием
Старый 15.03.2018, 22:53   #6
maxick
Новичок
Джуниор
 
Регистрация: 15.03.2018
Сообщений: 1
По умолчанию

Хм, я с таким не сталкивался ранее.
----------------
http://kuharochka.pp.ua
maxick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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