Russian Qt Forum
Апрель 25, 2024, 02:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Многопоточный файл-сервер  (Прочитано 2057 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Август 09, 2014, 13:39 »

Добрый день. Опишу в кратце задачу, а потом буду рад услышать советы.

Нужно создать свой файл-сервер. Файлы произвольного формата, сервер ведет список доступных файлов в определенной папке, + помнит их CRC32 (вычисляет при добавлении/обновлении файла).
Клиент при подключении к серверу получает список файлов, сравнивает crc32 с локальными файлами, и если есть отличия - загружает те, которые обновлены.
Клиентов порядка 30 штук, но может быть и больше. Запросы на файлы будут не очень частыми, но и не редкими, т.е. в один момент времени может читать несколько клиентов.
Так же сервер должен принимать новые файлы от клиентов и обновлять их в своей папке и вычислять crc32 этих файлов.

Какая идея.

С передачей файлов от клиента на сервер и обратно разобрался в отдельных простых приложениях.
Теперь надо собрать все в кучу.

Как я сделал. Создал наследника от QTcpServer, в incomingConnection создаю объект сессию, передаю ему дескриптор сокета.

А вот с сессиями нужно разобраться немного по подробнее.
Сессия должна поддерживать такие функции
-возвратить список файлов клиенту при запросе (сделано)
-загрузить файл на клиента
-получить файл с клиента.

При загрузке/получения я создаю дополнительный QTcpServer, номер открытого порта отправляю клиента, клиент создает дополнительное соединение по этому порту, и начинает заливать/скачивать файл по этой связи. QDataSream не использую, все сырые байты (для того что может быть будут подключения не от Qt программ).

Собственно вопрос. Раньше я пытался в каждой сессии при запросе скачать/выкачать файл создавал передачу и прием в отдельном потоке, но при работе шла ругань на разные потоки при работе с сокетами. Отказался от дочерних потоков в сессиях, все вроде бы заработало. Но терзают сомнения, правильно ли я сделал.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Август 09, 2014, 13:45 »

Отказался от дочерних потоков в сессиях, все вроде бы заработало. Но терзают сомнения, правильно ли я сделал.
Правильно, для такой задачи не нужны никакие рабочие потоки: получил - записал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.