Название: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: koldun90 от Декабрь 09, 2020, 22:10 Возможно ли удалить объект QtcpSocket при этом не закрывать само соединение.
Суть в том что я передаю sockedescriptor QAbstractSocket::socketDescriptor() и соответственно QAbstractSocket::setSocketDescriptor() между потоками и создаю в треде QtcpSocket. Тред работает и затем в конце работы он должен освободить сам QtcpSocket, при этом как бы не разрывая соединение Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: Racheengel от Декабрь 10, 2020, 11:43 В смысле, надо создать соединение в одном треде, а использовать в другом?
Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: ecspertiza от Декабрь 10, 2020, 15:34 По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер.
Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: koldun90 от Декабрь 10, 2020, 17:01 В смысле, надо создать соединение в одном треде, а использовать в другом? совершенно вернопосле использования в другом треде нужно удалить объект QTcpSocket(сделать deletelater) который был создан в другом треде(setsocketdescriptor), но соединение не закрывать Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: Racheengel от Декабрь 11, 2020, 17:07 Насколько я понимаю, нет сокета - нет соединения.
Можно попробовать moveToThread вызвать, но ИМХО QTcpSocket - одна из самых косячных концепций в Qt... Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: tux от Декабрь 11, 2020, 22:16 А может лучше архитектуру приложения пересмотреть?
Создавать соединение в одном потоке, а потом использовать его в другом - так себе идея. Хотя, если ТС любитель самобытных проблем... :) Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: Авварон от Декабрь 12, 2020, 00:34 По коду QTcpSocket не нашел что бы при деструкции он удалял физические сокеты. Нужно проверить. Думаю проверить можно достаточно просто. Поднять QTcpServer с одной стороны, с другой сокет, выполнить подключение, отправить данные и секунд через 5ть просто вызвать деструкцию сокета, далее посмотреть как себя поведет сервер. он действительно не закрывает сокеты потому что пришлось бы звать виртуальную функцию из деструктора Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: koldun90 от Декабрь 12, 2020, 17:49 Я использую сокт в таске (наследник qrunnable) передав туда socketdescriptor и создав там QtcpSocket и вызвав setsocketdeskriptor
когда я вызываю sock->write() данные у клиента не поступают, но когда делаю после вызова write sock->waitforbyteswritte() данные приходят клиенту и он ловит у себя сигнал readyread. ps с waitforbyteswritte() передается после этого думаю потому что если его не указывать то объект runnable уничтожается раньше наверно чем сокет реально передает в буфер ос Название: Re: Удаление QtcpSocket без закрытия дескриптора(соединения) Отправлено: koldun90 от Декабрь 16, 2020, 20:52 получается я так понял что в наследнике qrunnable обязательно нужно использовать waitforbytewritten после write
|