Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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

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

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

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

Цитата:
Сообщение от 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 Кб, 1 просмотров)
Андрей Цапко вне форума   Ответить с цитированием
Старый 20.02.2018, 19:02   #4
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,570
Репутация: 1777
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# программирование сокетов k0shiki C# (си шарп) 5 12.10.2017 11:06
Шифрование сокетов Den69 Visual C++ 0 15.01.2016 19:39
Программирование сокетов adkomissarov Общие вопросы Delphi 5 03.02.2015 18:53
Программирование сокетов Anubys C/C++ Сетевое программирование 5 26.11.2011 00:33
Организация сокетов mar4elo Работа с сетью в Delphi 1 01.01.2009 17:50


07:20.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru