Как Организовать Многопоточное Приложение.

  • Автор темы alexdrob
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

alexdrob

#1
Здравствуйте! Мне нужно сделать примерно следующцю структуру.

Есть Тред в котором идёт опрос открытого сокета на новые конекты. (SocketAccept)

Есть SocketManager, по сути просто содержит unordered_set<SocketThread*>. Он их создаёт, например 4, добавляет новые сокеты на прослушку в те треды, в которых меньше сокетов. Для сокета так же создаётся класс SocketClient и с функциями чтения и записи.

Есть SocketThread каждый вобратбатывается в отдельном потоке, у них постоянно вызывается метод Update. В данном методе поток спит на epoll_wait, и как только появляется активность, для данного сокета вызывается функция SocketClient->onRead(sock).

Сокеты не блокирующие и сколько данных прочитано, передаётся в EventManager EMgr->onRead(this, buff, len);

EMgr это связка между сокетной частью и приложением FTP сервера. То есть я хочу сделать так, что бы не было в пакете Net привязки к конкретно ФТП. И если нужно то можно там что то другое сделать, например http сервер или сервер для чата со своим протоколом.

EMgr отдаёт в FTP менеджер. Который в зависимости от ид сокета, вызывает в нужном объекте FTPSession функцию void FTPSession::appendData(char* b, int len)
Там всё парсится и распознаётся команда. Она выполняется.

FTPSession создаёт объект DataSession для канала данных. И вот он крутится в другом потоке. Там тоже есть несколько потоков, которые создаются FTPManager'ом. Они блокируются семафором.

Как только добавлена новая команда, один из свободных потоков, забирает из очереди класс DataSession и вызывает в нём функцию Update.

Во время отправки файла, буфер я сделал 1024 байта, за раз больше не отправит, что бы поток не работал с одним клиентом пока весь файл не отдаст, он по очереди переключается между разными клиентами. Так вот, беда в том, что бы правильно всё блокировать мьютексами, и откуда что удалять особенно при разрыве связи с сокетом клиента. Если канал данных активен, и оборвать связь, то сервер падает :(

Вот тут можно посмотреть на то что я наделал
Для просмотра контента необходимо: Войти или зарегистрироваться

Понимаю что кода много и разбираться не каждый захочет, но может кто то и посмотрит, посоветует что :)
 
A

alexdrob

#2
Вообщем переделал немного систему.
Отладка показала что падает на
C++:
Program received signal SIGPIPE, Broken pipe.
Добавил
C++:
signal(SIGPIPE, SIG_IGN);
не помогло, всё арвно падает на этом же :rolleyes:
Подскажите как поправить?
 
A

alexdrob

#3
Не помогает только когда из под gdb запущено :rolleyes:
 
Статус
Закрыто для дальнейших ответов.