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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Простой многопоточный сервер  (Прочитано 32958 раз)
BRE
Гость
« Ответ #45 : Декабрь 13, 2011, 15:48 »

Можно было тогда вообще не писать вашей реплики "это плохо и меня заканало это писать".
Я правда жалею.
Записан
Reklats
Гость
« Ответ #46 : Декабрь 13, 2011, 18:49 »

    С удовольствием выложу рабочие исходники своего сервера и приписку к названию сделаю, когда разберусь с проблемой. Или кто-нить поможет.

    Напомню суть: первое партия данных не считывается сервером. Или, если быть точнее, считывается, но 1 раз за 50 подключений примерно.
Подозреваю, что нужно что-то вроде waitForConnect(). Или по таймеру в слоте. Или вообще может поток как-то не правильно инициализируется. Идеи есть, но как это проверить я не в курсе.

    Согласен с идеей, что концепция "одно соединение - один поток" не правильна, ровно как и "все соединения в одном потоке", т.к. не обеспечивает нужного быстродействия. Думаю, что нужно в каждом потоке обслуживать некоторое число N соединений, а потом при превышении этого числа запускать новый поток. Думаю, что это будет компромиссом.
Записан
andrew.k
Гость
« Ответ #47 : Декабрь 13, 2011, 19:18 »

правильно думаешь, выложи еще раз в zip, если не сложно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Декабрь 13, 2011, 19:26 »

Думаю, что нужно в каждом потоке обслуживать некоторое число N соединений, а потом при превышении этого числа запускать новый поток. Думаю, что это будет компромиссом.
Это также обсуждалось, и уязвимые места довольно очевидны: трудно определить "время X" когда новая нитка должна быть создана, так же как и "время Y" когда от нее избавиться.

Никогда не имел никакого желания писать "многопоточный сервер", но, на мой взгляд, все multi-threaded задачи имеют много общего. Чем занимаюсь я в своей предметной области - это "нарезкой на порционные куски", выделением под-задач чтобы они могли быть скормлены любой рабочей нитке, их число = числу ядер. Это более 90% работы. Но есть еще задачи типа "проверить а не случилось ли чего" - и если да то подкинуть задания рабочим (типа диспетчера). Такие задачи нужно сливать в 1 нитку (ну или в как можно меньшее их число).

Повторюсь, что веб и сервера - не мой профиль, это просто "взгляд со стороны"  
Записан
Reklats
Гость
« Ответ #49 : Декабрь 13, 2011, 19:55 »

Это также обсуждалось, и уязвимые места довольно очевидны: трудно определить "время X" когда новая нитка должна быть создана, так же как и "время Y" когда от нее избавиться.
При каждом новом конекте, дисконнекте.

andrew.k, сорцы вот: http://pastebin.com/n0rM9Ncs
И тут ещё: http://www.prog.org.ru/index.php?topic=20287.msg138126#msg138126

UPD FIN: Решение найдено! У меня нулевое значение m_nNextBlockSize не задается вначале.
Какая же ламерская ошибка...

Код
C++ (Qt)
QServerThread::QServerThread(int socketDescriptor, QObject *parent)
   : QThread(parent), socketDescriptor(socketDescriptor), m_nNextBlockSize(0)
{
   this->moveToThread(this);
}
 
« Последнее редактирование: Декабрь 13, 2011, 20:20 от Reklats » Записан
andrew.k
Гость
« Ответ #50 : Декабрь 13, 2011, 20:47 »

m_nNextBlockSize где у тебя инициализируется?
Записан
Reklats
Гость
« Ответ #51 : Декабрь 14, 2011, 13:15 »

Ну вот. Рано радовался.

Какие-то странные пакеты шлёт сервер. Ну и клиент тоже. Вот:


1) Такой пакет шлёт клиент
2) Таким отвечает сервер
3) Такой пакет не ловится, а нужно обработать именно такой. Только регистрируется, что клиент что-то послал.

Что посоветуете?
Записан
Bepec
Гость
« Ответ #52 : Декабрь 14, 2011, 13:53 »

А что ты посылал? в 3 пакетике?
Записан
andrew.k
Гость
« Ответ #53 : Декабрь 14, 2011, 13:59 »

Вот ты бы там где у тебя break'и стоят добавил бы qDebug() какой-нибудь. Либо сам в отладке посиди.
Сразу станет понятно. В чем проблема.
Может размер неправильно считается и данных реально меньше, чем указано в размере.
Записан
Reklats
Гость
« Ответ #54 : Декабрь 14, 2011, 14:15 »

А что ты посылал? в 3 пакетике?
Третий пакет посылает клиент чата, протокол которого надо отдебажить, а в идеале - переписать сервер под Линух, т.к. автор зажал сорцы и даже просто протокол  Грустный А в пакете, скорее всего, посылается публичный ключ шифрования.

Может размер неправильно считается и данных реально меньше, чем указано в размере.
Точно, почему-то считывает "308" и соответственно во втором бряке выходит из цикла. Откуда он берет 308 - хз...
Записан
andrew.k
Гость
« Ответ #55 : Декабрь 14, 2011, 14:19 »

Ну так ты же сам говоришь, что в третий пакет тебе кто-то другой прислал.
С чего ты взял, что первые четыре байта у него длина пакета будет?
Тебе надо разбираться в его формате, тогда ты сможешь с ним работать.
Что ты вообще хочешь с ним сделать, если ты не знаешь, как он устроен?
Записан
Bepec
Гость
« Ответ #56 : Декабрь 14, 2011, 14:46 »

Reklats, а в твой протокол входит передача времени посыла? Или это эволюция твоей программы?
Записан
Reklats
Гость
« Ответ #57 : Декабрь 14, 2011, 14:50 »

Reklats, а в твой протокол входит передача времени посыла? Или это эволюция твоей программы?
Нет, не входит. Это лишнее, я это выкинул. Можно сказать, что это эволюция.

Пытаюсь вот побайтно считывать данные из сокета...
Записан
andrew.k
Гость
« Ответ #58 : Декабрь 14, 2011, 14:56 »

По-моему проще свой чат с нуля написать, чем ковырять чей-то протокол самопальный.
В чем смысл?
Записан
Bepec
Гость
« Ответ #59 : Декабрь 14, 2011, 15:00 »

andrew.k не соглашусь частично.

Проще написать свой протокол ^^.
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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