| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Передача дескриптора в поток, без сигналов |
| Автор: null56 30.6.2009, 19:18 | ||||||||
| Задача: В основном потоке висит слушающий сокет (QSslSocket) и ожидает соединений. В дочернем работает обработчик событий, который проверяет свою очередь на поступление новых дескрипторов сокетов. При поступлении нового сокета, основной поток засовывает дескриптор (число int) в очередь дочернего потока и продолжает слушать, дочерний поток периодами просматривает очередь и вытаскивает оттуда дескриптор сокета, затем создает объект QSslSocket и работает непосредственно с ним.... очередь реализована в виде нитебезопасного QList<int> В чем проблема: Если я засовываю дескриптор сокета в очередь в основном потоке, а потом вытаскиваю его из дочернего, то с этим дескриптором больше работать не выходит, он мертвый... то есть в дочернем не получается получить нормальный дескриптор соединения, он вообще больше ни на что не реагирует.... Как быть? что происходит с дескриптором сокета? почему не получается таким образом передать его в дочерний поток, чтобы он его обслуживал? Приведу небольшой код, чтобы было понятнее Основной код
Дочерний поток
Если кто знает в чем проблема, пожалуйста объясните... Заранее благодарен за помощь |
| Автор: SABROG 30.6.2009, 19:40 |
| И в консоль никаких варнингов не сыпется? |
| Автор: null56 1.7.2009, 14:06 |
| В общем ситуация в следующем.... 1) Сам сокет рабочий остается и коннект есть, это можно посмотреть, если использовать не ssl соединение 2) Ssl соединение происходит правильно, фукнции установки связи, загрузки сертификата и ключа просходят одинакого, как в родительском, так и в дочернем потоке Итог: что - то не так с ssl соединением, почему оно не хочет устанавливаться в таких, казалось бы логичных условиях, остается загадкой, надеюсь, что ответ мне дадут на багзилле Я прикрепил простенький примерчик, того, чего пытаюсь сделать, у кого будет время соберите, гляньте, может я не прав где - то |
| Автор: SABROG 1.7.2009, 14:28 | ||
Чет не собирается
--- Похоже у меня Qt собрана с поддержкой OpenSSL... Проверить не могу, сорри.. |
| Автор: null56 2.7.2009, 09:33 | ||
| Блин... тут поэкспериментировали с одним знакомым и он нашел способ при котором работать стало, но я не понимаю, это не совсем логично Работать стало, если я вызываю одну из функций
после вызова startServerEncryption(), даже на одну миллисекунду и всё отрабатывает В чем проблема? ведь с функцией waitForEncrypted ничего не работает, а с ними работает |
| Автор: null56 3.7.2009, 10:03 | ||
| Собственно я догадался в чем проблема и, к сожалению, решить ее нельзя... QSslSocket дальний родственник QObject и все события, которые происходят с самим сокетом, могут определяться только в EventLoop. То есть, когда создается новое соединение и я передаю его в тот поток в котором НЕ работает обработчик событий, то объект класса QSslSocket становится мертвым по отношению к событиям, связанным с находящимся внутри объекта сокетом... Сейчас ставил экспиременты с обычным незащищенным соединением, и пытался серверу передать данные от клиента... серверныый сокет молчал на вызовы функций
То есть некому опрашивать сокеты на то или иное событие, а эти функции всего лишь внешний интерфейс, который можно использовать только в качестве анализа уже отработанных exec-ом событий. Именно поэтому, скорее всего не отрабатывает подтверждение ключа на серверное стороне... Так что всё завязано в недрах qt я вижу это так |
| Автор: SABROG 3.7.2009, 16:08 |
| Ничего не понимаю, собрал Qt из репозитория, а прога все-равно не находит QSslSocket. |
| Автор: null56 3.7.2009, 17:09 | ||
| попробуй выкачай qt-creator, целиковый под выньду, у меня работал.... у меня нет винды и я никогда не собирал и не ставил qt под винду я работаю на gentoo, всё компилируя.... проблем вроде не было
флаг выставлен... остальное сам тянет |
| Автор: SABROG 6.7.2009, 11:46 | ||||
| Собрал таки. Вот такое вижу в консоли: //ssl_client
//threadServer
|
| Автор: null56 6.7.2009, 20:44 |
| SABROG, в каком случае ты это видишь? когда передается в дочерний поток? |
| Автор: SABROG 6.7.2009, 21:01 | ||
На самом деле я просто тупо скомпилил сервер и клиент и запустил оба. |
| Автор: null56 7.7.2009, 11:55 | ||
| SABROG, если не сложно... в файле tcpserver.cpp в функции TcpServer :: incomingConnection ( int socketDescriptor ), закомментируй вызов create, а m_SocketThread.add раскомментируй и проверь, будет ли тот же результат... буду благодарен вот чего тролли написали
бред какой - то... тоже не катит без евентлупа |