A
alexdrob
Здравствуйте! Мне нужно сделать примерно следующцю структуру.
Есть Тред в котором идёт опрос открытого сокета на новые конекты. (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 байта, за раз больше не отправит, что бы поток не работал с одним клиентом пока весь файл не отдаст, он по очереди переключается между разными клиентами. Так вот, беда в том, что бы правильно всё блокировать мьютексами, и откуда что удалять особенно при разрыве связи с сокетом клиента. Если канал данных активен, и оборвать связь, то сервер падает
Вот тут можно посмотреть на то что я наделал link removed
Понимаю что кода много и разбираться не каждый захочет, но может кто то и посмотрит, посоветует что
Есть Тред в котором идёт опрос открытого сокета на новые конекты. (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 байта, за раз больше не отправит, что бы поток не работал с одним клиентом пока весь файл не отдаст, он по очереди переключается между разными клиентами. Так вот, беда в том, что бы правильно всё блокировать мьютексами, и откуда что удалять особенно при разрыве связи с сокетом клиента. Если канал данных активен, и оборвать связь, то сервер падает
Вот тут можно посмотреть на то что я наделал
Понимаю что кода много и разбираться не каждый захочет, но может кто то и посмотрит, посоветует что