Russian Qt Forum
Ноябрь 22, 2024, 01:26
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Удаление QtcpSocket без закрытия дескриптора(соединения)
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Удаление QtcpSocket без закрытия дескриптора(соединения) (Прочитано 9321 раз)
koldun90
Крякер
Offline
Сообщений: 345
Удаление QtcpSocket без закрытия дескриптора(соединения)
«
:
Декабрь 09, 2020, 22:10 »
Возможно ли удалить объект QtcpSocket при этом не закрывать само соединение.
Суть в том что я передаю sockedescriptor
QAbstractSocket::socketDescriptor() и соответственно QAbstractSocket::setSocketDescriptor()
между потоками и создаю в треде QtcpSocket.
Тред работает и затем в конце работы он должен освободить сам QtcpSocket, при этом как бы не разрывая соединение
«
Последнее редактирование: Декабрь 09, 2020, 22:16 от koldun90
»
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #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
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #2 :
Декабрь 10, 2020, 15:34 »
По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер.
Записан
koldun90
Крякер
Offline
Сообщений: 345
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #3 :
Декабрь 10, 2020, 17:01 »
Цитата: Racheengel от Декабрь 10, 2020, 11:43
В смысле, надо создать соединение в одном треде, а использовать в другом?
совершенно верно
после использования в другом треде нужно удалить объект QTcpSocket(сделать deletelater) который был создан в другом треде(setsocketdescriptor), но соединение не закрывать
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #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
Сообщений: 404
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #5 :
Декабрь 11, 2020, 22:16 »
А может лучше архитектуру приложения пересмотреть?
Создавать соединение в одном потоке, а потом использовать его в другом - так себе идея. Хотя, если ТС любитель самобытных проблем...
Записан
Digital Art
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #6 :
Декабрь 12, 2020, 00:34 »
Цитата: ecspertiza от Декабрь 10, 2020, 15:34
По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер.
он действительно не закрывает сокеты потому что пришлось бы звать виртуальную функцию из деструктора
Записан
koldun90
Крякер
Offline
Сообщений: 345
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #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
Сообщений: 345
Re: Удаление QtcpSocket без закрытия дескриптора(соединения)
«
Ответ #8 :
Декабрь 16, 2020, 20:52 »
получается я так понял что в наследнике qrunnable обязательно нужно использовать waitforbytewritten после write
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...