Название: Многопоточный файл-сервер Отправлено: Fregloin от Август 09, 2014, 13:39 Добрый день. Опишу в кратце задачу, а потом буду рад услышать советы.
Нужно создать свой файл-сервер. Файлы произвольного формата, сервер ведет список доступных файлов в определенной папке, + помнит их CRC32 (вычисляет при добавлении/обновлении файла). Клиент при подключении к серверу получает список файлов, сравнивает crc32 с локальными файлами, и если есть отличия - загружает те, которые обновлены. Клиентов порядка 30 штук, но может быть и больше. Запросы на файлы будут не очень частыми, но и не редкими, т.е. в один момент времени может читать несколько клиентов. Так же сервер должен принимать новые файлы от клиентов и обновлять их в своей папке и вычислять crc32 этих файлов. Какая идея. С передачей файлов от клиента на сервер и обратно разобрался в отдельных простых приложениях. Теперь надо собрать все в кучу. Как я сделал. Создал наследника от QTcpServer, в incomingConnection создаю объект сессию, передаю ему дескриптор сокета. А вот с сессиями нужно разобраться немного по подробнее. Сессия должна поддерживать такие функции -возвратить список файлов клиенту при запросе (сделано) -загрузить файл на клиента -получить файл с клиента. При загрузке/получения я создаю дополнительный QTcpServer, номер открытого порта отправляю клиента, клиент создает дополнительное соединение по этому порту, и начинает заливать/скачивать файл по этой связи. QDataSream не использую, все сырые байты (для того что может быть будут подключения не от Qt программ). Собственно вопрос. Раньше я пытался в каждой сессии при запросе скачать/выкачать файл создавал передачу и прием в отдельном потоке, но при работе шла ругань на разные потоки при работе с сокетами. Отказался от дочерних потоков в сессиях, все вроде бы заработало. Но терзают сомнения, правильно ли я сделал. Название: Re: Многопоточный файл-сервер Отправлено: Old от Август 09, 2014, 13:45 Отказался от дочерних потоков в сессиях, все вроде бы заработало. Но терзают сомнения, правильно ли я сделал. Правильно, для такой задачи не нужны никакие рабочие потоки: получил - записал. |