C++ Qt Многопоточный TCP сервер

410
28 июня 2017, 00:00

Нужно написать сервер для приёма данных от разных по типу устройств с подтверждением приёма. Устройства присылают разные данные и алгоритм общения с каждым типом устройств разный. Из-за скудного знания с++ столкнулся с проблемой реализации. Я хочу пойти по следующему пути: запускаю служащий сервер. При приеме данных (первый пакет устройства - идентификатор типа устройства и его номер) созданный сокет отправляется в отдельный поток и дальше идёт обработка данных определённого устройства в отдельном потоке. Проблема: у меня есть класс с алгоритмом обработки пакетов идентификаторов и создание общего сокета. После создания экземпляра и приёма нужного пакета идентификатора не знаю как передать данный сокет в новый поток с новым алгоритмом обработки пакетов. Делаю это я для того, чтобы уменьшить длину передаваемых данных и снизить нагрузку на процессор (избавлюсь от множества условных операторов при каждом принятом пакете). Возможно у меня неправильная логика, поэтому прошу направить на правильный алгоритм. Моя реализация многопоточности: создаю экземпляр Qthread и с помощью MoveToThread передаю экземпляр с сокетом и обработки данных устройства. С потоками я ещё не до конца разобрался. Насколько я понял, в qt можно создать поток и поместить в него объект и только ловить сигналы от потока.

Answer 1

Здравствуйте! Описание несколько запутанное. Если я правильно понял, то архитектура приложения такова, что сначала вы парсите сообщение (определяя устройство) - в главном потоке и затем а зависимости от того какое устройство определилось запускает поток, которому передайте сокет. На мой взгляд это несколько не правильно. По-моему, следует создать многопоточный сервер, который на каждое соединение поднимает поток. Тогда получится, что вы сразу в потоке будете оперировать с сокетом как с объектом и не надо будет никуда его передавать. И уже в этом же потоке будете парсить сообщение и вызывать класс-обработки. На тему того как создать многопоточный сервер много информации в гугле, могу привести одну из первых собравшихся ссылок: https://m.habrahabr.ru/post/131472/

Ну а если я не правильно понял вопрос и проблема именно в реализации, а не в архитектуре, то тогда скиньте проблемный код

READ ALSO
Рендер 2D изображения в текстуру OpenGL

Рендер 2D изображения в текстуру OpenGL

Имеется Framebuffer object с прикреплённой текстурой и буффером глубиныСначала происходит отрисовка в буффер, а потом этот буффер выводится на экран

328
Как использовать общую память для двух процессов С линукс

Как использовать общую память для двух процессов С линукс

Нужно сделать общим для нескольких процессов массив структурРешил сделать так: один из процессов выделяет общий блок памяти с помощью shmget,...

267
Можно ли в Qt из pro файла выдрать VERSION?

Можно ли в Qt из pro файла выдрать VERSION?

Можно ли в Qt из pro файла выдрать VERSION? И потом использовать его как константу например

266
Почему не срабатывает find

Почему не срабатывает find

При работе с SVG столкнулся с проблемой: не находится элемент tspan в строке

314