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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление QtcpSocket без закрытия дескриптора(соединения)  (Прочитано 9321 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Декабрь 09, 2020, 22:10 »

Возможно ли удалить объект QtcpSocket при этом не закрывать само соединение.
Суть в том что я передаю sockedescriptor
QAbstractSocket::socketDescriptor() и соответственно QAbstractSocket::setSocketDescriptor()
между потоками и  создаю в треде QtcpSocket.
Тред работает и затем в конце работы он должен освободить сам QtcpSocket, при этом как бы не разрывая соединение
« Последнее редактирование: Декабрь 09, 2020, 22:16 от koldun90 » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Декабрь 10, 2020, 11:43 »

В смысле, надо создать соединение в одном треде, а использовать в другом?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Декабрь 10, 2020, 15:34 »

По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #3 : Декабрь 10, 2020, 17:01 »

В смысле, надо создать соединение в одном треде, а использовать в другом?
совершенно верно
после использования в другом треде нужно удалить объект QTcpSocket(сделать deletelater) который был создан в другом треде(setsocketdescriptor), но соединение не закрывать
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Декабрь 11, 2020, 17:07 »

Насколько я понимаю, нет сокета - нет соединения.
Можно попробовать moveToThread вызвать, но ИМХО QTcpSocket - одна из самых косячных концепций в Qt...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #5 : Декабрь 11, 2020, 22:16 »

А может лучше архитектуру приложения пересмотреть?
Создавать соединение в одном потоке, а потом использовать его в другом - так себе идея. Хотя, если ТС любитель самобытных проблем... Улыбающийся
Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Декабрь 12, 2020, 00:34 »

По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер.

он действительно не закрывает сокеты потому что пришлось бы звать виртуальную функцию из деструктора
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #7 : Декабрь 12, 2020, 17:49 »

Я использую сокт в таске (наследник qrunnable) передав туда socketdescriptor и создав там QtcpSocket и вызвав setsocketdeskriptor
когда я вызываю sock->write() данные у клиента не поступают, но когда делаю после вызова write   sock->waitforbyteswritte() данные приходят клиенту и он ловит у себя сигнал readyread.

ps с waitforbyteswritte() передается после этого думаю потому что если его не указывать то объект runnable уничтожается раньше наверно чем сокет реально передает в буфер ос
« Последнее редактирование: Декабрь 12, 2020, 17:54 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #8 : Декабрь 16, 2020, 20:52 »

получается я так понял что в наследнике qrunnable обязательно нужно использовать waitforbytewritten после write
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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