![]() |
|
![]() ![]() ![]() |
|
niklep |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Доброго времени суток. Есть слот, связанный с сигналом:
Вот этот слот:
Его суть проста: при появлении данных на серверном сокете он вызывается, принимает их. После приема этих данных происходит их отправка на COM-порт с помощью метода temp_com->writeToPort(str2); Т.е. суть следующая: на сокет приходит команда, она отправляется COM-порту. Далее ждем ответа от COM-порта:
И как только появляется ответ вызываем нужный слот:
Вот здесь-то при отправке ответа на сокет и бросается исключение. Причем если я вызову сам (а в слоте закоментирую) sendToClient внутри слота slotReadClient(), то исключения нет. Просто в данной ситуации ответ не всегда успеет сформироваться полностью. Поэтому такой вариант мне не подходит. В чем может быть проблема? Это сообщение отредактировал(а) niklep - 28.4.2011, 07:27 |
||||||||
|
|||||||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
показывай sendToClient
и чему равен clientSocket в slotReadCom ? Это сообщение отредактировал(а) borisbn - 28.4.2011, 09:22 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
а откуда берёте clientSocket в slotReadCom? sender здесь будет temp_com->port.
sender пользоваться не рекомендуется, лучше при появлении клиента создать класс ClientReader (отдельный экземляр на кождого клиента), который будет хранить clientSocket и получать сигналы. ну и конечно, нужно знать что делает sendToClient Это сообщение отредактировал(а) math64 - 28.4.2011, 08:51 |
|||
|
||||
niklep |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
[offtop]
Гребаный IE9... Написал пост, нажал отправить, а осел почему-то его не отправил... Пишу заново [\offtop]
clientSocket в slotReadCom берется как поле класса:
Честно говоря, всю работу с сетью я взял из учебников по Qt и особо не вдавался в подробности, почему используется именно конструкция
и как сделать иначе. Просто на маленьком учебном проекте данные методы работали. Сильно не пинайте, я кодить ООП начал месяц назад. |
||||||
|
|||||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
в функции void ServerSocket::slotReadClient() ты объявляешь локальную переменную clientSocket
а переменную член класса с тем же именем ничем не инициализируешь. сделай так
Добавлено через 1 минуту и 29 секунд
Даже не знаю, стОит ли советовать зарезать ишака и взять что-нибудь покошернее - лису или оперу... ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
niklep |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Действительно, помогло. Сказывается недостаточные теоретические знания. Спасибо.
Правда он ничего мне не отправил=) P.S. Естественно, пользуюсь постоянно лисой, но вдруг возникла мысль: "А дай-ка я несколько минут опробую новый IE. Вдруг он не так плох?..." =) |
|||
|
||||
borisbn |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
стоп! у тебя ж зацикливание получается:
1. Направляем данные из clientSocket в slotReadClient()
2. В slotReadClient() запоминаем от кого пришли данные
3. Направляем эти данные в COM
4. Направляем данные, принятые из COM в slotReadCom()
5. В slotReadCom() отправляем данные кому ? clientSocket'ту
Скажи, как изначально инициализируется clientSocket ? Где ты делаешь
? А лучше скинь весь проект. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||||
|
|||||||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
так будет работать, если клиент один.
Если же пока ком-порт не ответил, придет запрос от другого клиента, clientSocket затрётся и ответ для первого клиента получит второй. Поскольку ком-порт один, второго клиента нужно либо игнорировать, или ставить в очередь например, храня сокеты поставленных в очередь клиентов в QList<QTcpSocket*> или QList<QPair<QTcpSocket*, QByteArray> > если вместе с сокетом нужно хранить принятые от него данные. |
|||
|
||||
niklep |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Тот самый connect я делаю здесь:
И да, как мне его здесь инициализировать? Также? Наверное стоит здесь сделать
Короче я запутался=) Весь проект весит много (25Мб). Давай я сюда кину полностью эти 2 класса (ServerSocket и ComHandler). Посмотрим их. Добавлено через 3 минуты и 43 секунды serversocket.h
serversocket.cpp
comhandler.h
comhandler.cpp
Добавлено через 6 минут и 40 секунд Так да, но у меня задумано (по крайней мере пока что), что с одной железкой будет работать только один пользователь. Данный проект - это виндовая служба, и если понадобится, то для другого человека цепляется другая железка и запускается новая служба, которая с другим COM-портом общается. |
||||||||||||
|
|||||||||||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
в данном случае всё равно. ты либо создашь локальную переменную, законнектишь её сигнал на слот, в котором получишь этот указатель через sender() и запомнишь в члене класса clientSocket, либо сразу запомнишь при новом соединении.
может теперь проблема в клиенте ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
niklep |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Привожу код клиента. Также приведу код сервера (данные клиент и сервер я изначально написал для тестов и для обучения).
КЛИЕНТ (хотел сделать его многопоточным для нормальной работы GUI, но пока не осилил=)) client.h
client.cpp
mythread.h
mythread.cpp
СЕРВЕР server.h
server.cpp
Вот они прекрасно обмениваются сообщениями. Надо искать разницу... |
||||||||||||
|
|||||||||||||
niklep |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Опаньки... сменил в коде везде Qt_4_5 на Qt_4_7 как на сервере, так и на клиенте, и заработало... Я как-то не задумывался над этим значением. Там всегда нужно держать текущую установленную версия Qt?
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
проблема могла быть в несоответствии упаковки данных QDataStream разных версий. вопрос в том, что при компиляции и клиента и сервера нужно использовать одну и ту же версию Qt или в том, что нужно ли устанавливать Qt на компьютер, где будет крутиться программа (сервис) ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
niklep |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 9.5.2010 Репутация: нет Всего: нет |
Ну, на сервере и клиенте у меня версии совпадали. Странно. Qt_4_5 тоже в свое время взял из учебника и не менял с тех пор.
Я имел ввиду, что в данной опции Qt_4_x необходимо указывать именно ту версию, которая установлена на компьютере(?) Естественно, у меня не возникало мыслей о том, что в коде сервера и клиента использовать разные опции Qt_4_x. Вообще, вопрос можно сформулировать так: что данная опция вообще делает? Например
означает, что будет использоваться реализация Qt_4_5 для данного класса? Qt что, хранит в себе и старые версии библиотек тоже? Вряд ли... |
||||||
|
|||||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Нет, она хранит не версии библиотеки, а версии алгоритма сериализации/десериализации данных в QDataStream. Почитай про setVersion и про Versioning -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |