Название: Помогите с сервером.... Отправлено: lolbla2 от Февраль 23, 2012, 17:14 Вообщем сервер рассылает данные в отдельный поток...
myserver.cpp Код
Mythread.cpp Код
Не могу понять, в закомменченной строке "падает тут" происходит ошибка сегментации SEGSIG fault, вроде для сокета память выделена и для потока, в чём же дело? Название: Re: Помогите с сервером.... Отправлено: Alex Custov от Февраль 23, 2012, 17:23 У тебя после ошибки "Could not start server" создаётся поток чтения, а если ошибки нет, то он не создаётся. По-мойму тут что-то должно быть наоборот :)
Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 23, 2012, 17:29 Непонятно зачем тебе поток - все у тебя происходит в главном потоке, а дополнительный просто eventLoop гоняет
Да и сокет в случае ошибки ты тож не удаляешь - так и висит он в утекшей памяти)) Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 23, 2012, 18:24 Непонятно зачем тебе поток - все у тебя происходит в главном потоке, а дополнительный просто eventLoop гоняет Да и сокет в случае ошибки ты тож не удаляешь - так и висит он в утекшей памяти)) Отдельный поток только в run ? а то что просто поток гоняется и если кто-то подключился обрабатывается... Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 23, 2012, 19:19 Отдельный поток только в run ? а то что просто поток гоняется и если кто-то подключился обрабатывается... Сейчас вся обработка сигналов от сокета происходит в том же потоке, в котором крутится сервер Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 23, 2012, 19:30 Отдельный поток только в run ? а то что просто поток гоняется и если кто-то подключился обрабатывается... Сейчас вся обработка сигналов от сокета происходит в том же потоке, в котором крутится сервер почему? типо отдельный поток только в методе run? а класс QThread на самом деле не весь в отдельном потоке? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 23, 2012, 19:34 Ага, QThread - это просто класс, управляющий потоком. В новом треде выполняется только метод run() и все, что вызвано из него непосредственно
Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 23, 2012, 20:13 Ага, QThread - это просто класс, управляющий потоком. В новом треде выполняется только метод run() и все, что вызвано из него непосредственно Ладно, хорошо тогда принимать буду в основном потоке, а рассылать хочу всем клиентам в отдельном потоке пытаюсь это сделать следующим образом: Myserver.cpp Код
MyThread.cpp Код
в итоге получаю: Listening... 264 Connecting... 264 Client Connected Data in: "fgd" Starting thread QObject: Cannot create children for a parent that is in a different thread. (Parent is QNativeSocketEngine(0x5d4d48), parent's thread is QThread(0x5d2e28), current thread is MyThread(0x5d6458) Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 23, 2012, 20:22 ты создал сокет в одном потоке, а используешь в другом. Внутренние объекты сокета противятся такому.
да и идея создать один сокет, а потом засовывать его в массив несколько раз, как будто их много, тоже не особо хороша Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 23, 2012, 20:32 ты создал сокет в одном потоке, а используешь в другом. Внутренние объекты сокета противятся такому. да и идея создать один сокет, а потом засовывать его в массив несколько раз, как будто их много, тоже не особо хороша а как же мне тогда в отдельном потоке разослать всем клиентам данные? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 23, 2012, 21:04 Ну например можно мувнуть сокет в нужный тред. Или создать его прям в нужном треде
ну и еще - тред у тебя не умрет никогда, а на каждую новую порцию данных будет создан новый Название: Re: Помогите с сервером.... Отправлено: fuCtor от Февраль 24, 2012, 14:39 А может посмотреть на существующие решения в плане организации межпроцессного общения и соответствующим протоколам?
Либо сервер должен в само приложения встраиваться наряду с клиентом? Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 14:52 А может посмотреть на существующие решения в плане организации межпроцессного общения и соответствующим протоколам? Можно ссылки по этому поводу пожалуйста...?Либо сервер должен в само приложения встраиваться наряду с клиентом? Не совсем понял вопрос. Клиент отдельно, сервер отдельно. Сервер принимает данные от какой-нибудь клиента и отсылает их всем клиентам. То есть он нужен чтобы разослать данные от каждого клиента каждому клиенту, т.е. для взаимодействия клиентов каждый с каждым. Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 14:54 Ну например можно мувнуть сокет в нужный тред. Или создать его прям в нужном треде ну и еще - тред у тебя не умрет никогда, а на каждую новую порцию данных будет создан новый Имеешь в виду для каждого сокета отдельный поток что ли? Типо сокет подключился, создали для него поток... Я то хотел один поток для передачи всем сокетам (клиентам), поэтому в поток передаю список клиентов. Кстати почему-то лист клиентов нельзя мувнуть в поток... почему? Чот я до конца не пойму, это получается поток может использовать только объекты созданные внутри него или как ? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 24, 2012, 16:18 Ну например можно мувнуть сокет в нужный тред. Или создать его прям в нужном треде ну и еще - тред у тебя не умрет никогда, а на каждую новую порцию данных будет создан новый Имеешь в виду для каждого сокета отдельный поток что ли? Типо сокет подключился, создали для него поток... Я то хотел один поток для передачи всем сокетам (клиентам), поэтому в поток передаю список клиентов. Кстати почему-то лист клиентов нельзя мувнуть в поток... почему? Чот я до конца не пойму, это получается поток может использовать только объекты созданные внутри него или как ? что значит "мувнуть лист клиентов"? нет, поток может и другие объекты использовать, но родитель объекта и сам объект должны находиться в одном и том же потоке можно и один поток на весь список клиентов, просто лучше сокеты для этих клиентов прям в потоке создавать. Кстати, сокет у тебя сейчас только один, независимо от количества клиентов, что неправильно Название: Re: Помогите с сервером.... Отправлено: fuCtor от Февраль 24, 2012, 16:23 А может посмотреть на существующие решения в плане организации межпроцессного общения и соответствующим протоколам? Можно ссылки по этому поводу пожалуйста...?Либо сервер должен в само приложения встраиваться наряду с клиентом? Не совсем понял вопрос. Клиент отдельно, сервер отдельно. Сервер принимает данные от какой-нибудь клиента и отсылает их всем клиентам. То есть он нужен чтобы разослать данные от каждого клиента каждому клиенту, т.е. для взаимодействия клиентов каждый с каждым. Если сервер отдельно, то гораздо проще. На вскидку:
Пример описывающие идеологию AMQP можно посмотреть тут: http://www.rabbitmq.com/getstarted.html и тут http://www.rabbitmq.com/tutorials/amqp-concepts.html Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 16:24 Ну например можно мувнуть сокет в нужный тред. Или создать его прям в нужном треде ну и еще - тред у тебя не умрет никогда, а на каждую новую порцию данных будет создан новый Имеешь в виду для каждого сокета отдельный поток что ли? Типо сокет подключился, создали для него поток... Я то хотел один поток для передачи всем сокетам (клиентам), поэтому в поток передаю список клиентов. Кстати почему-то лист клиентов нельзя мувнуть в поток... почему? Чот я до конца не пойму, это получается поток может использовать только объекты созданные внутри него или как ? что значит "мувнуть лист клиентов"? нет, поток может и другие объекты использовать, но родитель объекта и сам объект должны находиться в одном и том же потоке вот это QList <QTcpSocket *> clients как moveToThread сделать? по одному только что ли мувать? чот блин с такими ограничению по использованию объектов мне даже пока норм идей не пришло как сделать чтобы можно было получать от всех клиентов данные и отправлять всем клиентам данные в отдельном потоке, ну или хотя бы только отправлять в отдельном потоке а получать в главном Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 24, 2012, 16:30 да, только по одному.
Вот тебе идея - создаешь объект, умеющий работать с сокетами. создаешь тред. муваешь этот объект в тред. в методе void MyServer::incomingConnection(int socketDescriptor) сигналом передаешь этому объекту socketDescriptor. Объект принимает дескриптор и создает для него сокет. А дальше объект вычитывает данные из сокетов, и отправляет через них же ответы клиентам Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 17:44 да, только по одному. Вот тебе идея - создаешь объект, умеющий работать с сокетами. создаешь тред. муваешь этот объект в тред. в методе void MyServer::incomingConnection(int socketDescriptor) сигналом передаешь этому объекту socketDescriptor. Объект принимает дескриптор и создает для него сокет. А дальше объект вычитывает данные из сокетов, и отправляет через них же ответы клиентам объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 24, 2012, 17:48 объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный? Нет, просто наследник QObject с нужными методами и слотами (для приема данных от сокета, для отправки данных через сокет) Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 19:06 объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный? Нет, просто наследник QObject с нужными методами и слотами (для приема данных от сокета, для отправки данных через сокет) Извини за тугодумство ;D, но чот я не догнал зачем QObject здесь? можно насчёт этого попдробнее с примерчиком кода?)_) Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 24, 2012, 19:35 QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда?
Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 19:36 QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда? ну сокет же сам как объект, да и тред тоже объект Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 24, 2012, 19:37 QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда? ну сокет же сам как объект, да и тред тоже объект Блин, ну не нравится - делай по-своему, я же не заставляю Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 24, 2012, 20:17 QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда? ну сокет же сам как объект, да и тред тоже объект Блин, ну не нравится - делай по-своему, я же не заставляю я просто примерчик прошу чтобы понятнее было Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 13:20 Код
вот приблизительно так я вижу класс, который будет жить в потоке. Удаление сокетов при отключении добавь по вкусу)) Писал не компилируя, могуть быть синтаксические ошибки Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 15:06 Код
вот приблизительно так я вижу класс, который будет жить в потоке. Удаление сокетов при отключении добавь по вкусу)) Писал не компилируя, могуть быть синтаксические ошибки А как теперь с потоком связать это? Я думаю так может: В класс потока добавить этот объект Replyer. В классе сервера на incomingConnection добавить в поток в объект Replyer подключившийся сокет, передав ему дескриптор сокета. Но тогда что должно выполняться в потоке в методе run ? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 15:43 QThread *thread = new QThread(this);
Replyer *repl = new Replyer(); repl->moveToThread(thread); thread->run(); и кончено же к newConnection(int descriptor) надо прявязываться без Qt::DirectConnection Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 16:55 QThread *thread = new QThread(this); Replyer *repl = new Replyer(); repl->moveToThread(thread); thread->run(); и кончено же к newConnection(int descriptor) надо прявязываться без Qt::DirectConnection Спасибо, а что в методе run в потоке делать? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 17:02 Спасибо, а что в методе run в потоке делать? ничего. не перегружай поток, а используй стандартный QThread Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 18:15 Спасибо, а что в методе run в потоке делать? ничего. не перегружай поток, а используй стандартный QThread спасибо вроде сделал, посмотри пожалуйста норм вышло? replyer.h, replyer.cpp Код
MyServerh, MyServer.cpp Код
Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 18:29 вроде должно работать. вот только читаешь ты все куски данных в один массив, так что если несколько клиентов одновременно пришлют данные, то их данные тупо смешаются
Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 19:29 вроде должно работать. вот только читаешь ты все куски данных в один массив, так что если несколько клиентов одновременно пришлют данные, то их данные тупо смешаются Хмм... кстати я тоже об этом думал, но когда пытался быстро слать от 2 клиентов сообщения с разных компов, то вроде всё норм, но вроде бы потенциально может прийти клиентам какая-нибудь фигня смешанная. А как эту проблему пофиксить? Завести какую-то очередь сообщений что ли? то есть клиент прислал сообщение его в очередь, а потом пока очередь не пуста отсылать эти сообщения клиентам, может так ? Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 20:23 Да просто заведи на каждого клиента свой blockSize
Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 20:27 Да просто заведи на каждого клиента свой blockSize а идея с очередью не катит?) Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 20:28 Да просто заведи на каждого клиента свой blockSize а идея с очередью не катит?) Не знаю, имхо излишне, хеша вида <сокет, blockSize> хватит с головой. Но можешь попробовать и очередь:) Название: Re: Помогите с сервером.... Отправлено: lolbla2 от Февраль 25, 2012, 20:32 Да просто заведи на каждого клиента свой blockSize а идея с очередью не катит?) Не знаю, имхо излишне, хеша вида <сокет, blockSize> хватит с головой. Но можешь попробовать и очередь:) сделал очередь, но не знаю как проверить работает ли... Название: Re: Помогите с сервером.... Отправлено: mutineer от Февраль 25, 2012, 20:46 И я не знаю. Это ж вероятная ситуация. Вызвать ее специально довольно сложно. проблема у тебя даже не в перемешивании данных, а в том, что blockSize ты прочитаешь из одного сокета, потом выйдешь из функции, а в следующий раз зайдешь уже когда сигнал будет от другого сокета и читать будешь уже не то, что ожидал
Название: Re: Помогите с сервером.... Отправлено: demaker от Сентябрь 17, 2012, 14:52 Но это только для 1-ого клиента :)
|