Russian Qt Forum

Qt => Работа с сетью => Тема начата: Fregloin от Август 09, 2014, 13:39



Название: Многопоточный файл-сервер
Отправлено: Fregloin от Август 09, 2014, 13:39
Добрый день. Опишу в кратце задачу, а потом буду рад услышать советы.

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

Какая идея.

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

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

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

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

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


Название: Re: Многопоточный файл-сервер
Отправлено: Old от Август 09, 2014, 13:45
Отказался от дочерних потоков в сессиях, все вроде бы заработало. Но терзают сомнения, правильно ли я сделал.
Правильно, для такой задачи не нужны никакие рабочие потоки: получил - записал.