0 / 0 / 0
Регистрация: 07.02.2022
Сообщений: 15
|
||||||||||||||||
1 | ||||||||||||||||
QTcpSocket SIGSEGV при попытке реконекта после краша сервера08.02.2022, 22:40. Показов 1067. Ответов 7
Учу QT. Пытаюсь реализовать удалённое управление мышкой через телефон с помощью QTcpServer и QTcpSocket. Однако при реконекте выпадает SIGSEGV
Вот конструктор клиента:
Запускается сервер и клиент жмём pushButton и подключаемся Закрываем сервер Запускаем сервер заново/не запускаем и жмём pushButton SIGSEGV В процессе гугления я наткнулся на это решение, однако то ли знаний в инглише не хватает, то ли знаний в qt, но я его не понял Собственно я пытался сделать что либо при получении сигнала disconnected() но это ничего не изменило:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
08.02.2022, 22:40 | |
Ответы с готовыми решениями:
7
[Error SIGSEGV] Возникает ошибка при попытке присваивания
Samsung Galaxy Ace s5831i не включается после краша Firefox Зависание программы при попытке пинга сервера |
322 / 231 / 50
Регистрация: 29.05.2018
Сообщений: 663
|
||||||
09.02.2022, 00:27 | 2 | |||||
А вот это пробовали (с той же ссылки стэковерфлоу):
0
|
2436 / 1176 / 435
Регистрация: 08.11.2016
Сообщений: 3,249
|
|
09.02.2022, 07:38 | 3 |
![]() Решение
у Вас в конструкторе клиента у сокета связан сигнал disconnected со слотом deleteLater, а значит при переходе сокета в состояние "отключен" он уничтожается и далее в своем слоте on_bushbutton_clicked Вы (при повторном подключении) разыменовываете уаазатель на разрушенный объект и получаете закономерный сегментэйшн фолт. Перенесите строки с созданием сокета и подключением сигналов из конструктора в слот on_button_clicked и вставьте их перед вызовом connectToHost.
2
|
1322 / 585 / 283
Регистрация: 02.05.2020
Сообщений: 1,409
|
|
09.02.2022, 09:31 | 4 |
А если после разрыва соединения и при удалении сокета создавать опять новый QTcpSocket?
0
|
2436 / 1176 / 435
Регистрация: 08.11.2016
Сообщений: 3,249
|
|
09.02.2022, 12:30 | 5 |
kapbepucm, похоже на подход проктолога в зубоврачебном кабинете, зачем создавать новый сокет при разрыве соединения? А если в дальнейшем соединение вовсе не будет устанавливаться вплоть до окончания работы программы, тогда вообще зачем содержать в памяти сконструированный сокет? Логичнее сконструировать сокет непосредственно перед установкой соединения. Хотя в данном конкретном случае вообще непонятно зачем создавать сокет в куче, уже куда лучше было бы объявить сокет непосредственным членом класса и отдать управление памятью на откуп непосредственно RAII и вместо связывания сигналов по deleteLater написать слот-обработчик для сигнала
void QTcpSocket::stateChanged(QAbstractSocket::SocketState socketState) , тем более что в текущем варианте, даже если перенести конструирование сокета и его связку с сигналами в слот-обработчик кнопки, то это хоть и уберет проблему с падение программы, но потенциально грозит утечкой памяти, так как если в ходе подключения к серверу произойдет какая-нибудь ошибка сокета, то сокет встанет в ошибку и выбросит stateChange, а disconnected так и не будет выброшен и сокет не будет удален, а при повторном нажатии на кнопку создастся новый сокет и перетрет старый указатель.
3
|
kapbepucm
|
09.02.2022, 13:35
#6
|
Не по теме: Annemesski, я невнимательно прочитал задание, почемуто решил, что речь идёт об автоматическом reconnect при обрыве связи :gsorry:
0
|
0 / 0 / 0
Регистрация: 07.02.2022
Сообщений: 15
|
|
09.02.2022, 16:51 [ТС] | 7 |
kapbepucm, спасибо, ваш совет помог.
А можно поподробнее про это? Создание в куче это socket = new QTcpSocket(this); ? Что значит объявить членом класса?
0
|
2436 / 1176 / 435
Регистрация: 08.11.2016
Сообщений: 3,249
|
|
09.02.2022, 16:56 | 8 |
Да, это оно. Память выделяемая вручную, выделяется в куче (грубо говоря в оперативной памяти).
Объявить членом класса объект типа QTcpSocket, а не указатель на него, тогда объект будет создан вместе с классом и уничтожен вместе с ним.
2
|
09.02.2022, 16:56 | |
Помогаю со студенческими работами здесь
8
QTcpSocket автоматический опрос сервера Ошибка 401 при попытке отправить push c удаленного сервера Предотвращение краша программы при ошибке транзакций При попытке загрузить данные из файла в базу данных сервера выдает ошибку -401 Unauthorize Ошибка HTTP 500 (Internal Server Error): При попытке сервера выполнить запрос возникла неожиданная ситуация. Http сервер и клиент. При попытке получить ответ клиента от сервера ошибка: Поток был недоступен для чтения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |