![]() |
|
|
![]()
|
|
| null56 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Задача:
В основном потоке висит слушающий сокет (QSslSocket) и ожидает соединений. В дочернем работает обработчик событий, который проверяет свою очередь на поступление новых дескрипторов сокетов. При поступлении нового сокета, основной поток засовывает дескриптор (число int) в очередь дочернего потока и продолжает слушать, дочерний поток периодами просматривает очередь и вытаскивает оттуда дескриптор сокета, затем создает объект QSslSocket и работает непосредственно с ним.... очередь реализована в виде нитебезопасного QList<int> В чем проблема: Если я засовываю дескриптор сокета в очередь в основном потоке, а потом вытаскиваю его из дочернего, то с этим дескриптором больше работать не выходит, он мертвый... то есть в дочернем не получается получить нормальный дескриптор соединения, он вообще больше ни на что не реагирует.... Как быть? что происходит с дескриптором сокета? почему не получается таким образом передать его в дочерний поток, чтобы он его обслуживал? Приведу небольшой код, чтобы было понятнее Основной код
Дочерний поток
Если кто знает в чем проблема, пожалуйста объясните... Заранее благодарен за помощь |
||||||||
|
|||||||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
И в консоль никаких варнингов не сыпется?
|
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
В общем ситуация в следующем....
1) Сам сокет рабочий остается и коннект есть, это можно посмотреть, если использовать не ssl соединение 2) Ssl соединение происходит правильно, фукнции установки связи, загрузки сертификата и ключа просходят одинакого, как в родительском, так и в дочернем потоке Итог: что - то не так с ssl соединением, почему оно не хочет устанавливаться в таких, казалось бы логичных условиях, остается загадкой, надеюсь, что ответ мне дадут на багзилле Я прикрепил простенький примерчик, того, чего пытаюсь сделать, у кого будет время соберите, гляньте, может я не прав где - то Это сообщение отредактировал(а) null56 - 1.7.2009, 14:07 Присоединённый файл ( Кол-во скачиваний: 7 )
ssl_problem.tar 20,00 Kb |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Чет не собирается
--- Похоже у меня Qt собрана с поддержкой OpenSSL... Проверить не могу, сорри.. Это сообщение отредактировал(а) SABROG - 1.7.2009, 14:45 |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Блин... тут поэкспериментировали с одним знакомым и он нашел способ при котором работать стало, но я не понимаю, это не совсем логично
Работать стало, если я вызываю одну из функций
после вызова startServerEncryption(), даже на одну миллисекунду и всё отрабатывает В чем проблема? ведь с функцией waitForEncrypted ничего не работает, а с ними работает |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Собственно я догадался в чем проблема и, к сожалению, решить ее нельзя...
QSslSocket дальний родственник QObject и все события, которые происходят с самим сокетом, могут определяться только в EventLoop. То есть, когда создается новое соединение и я передаю его в тот поток в котором НЕ работает обработчик событий, то объект класса QSslSocket становится мертвым по отношению к событиям, связанным с находящимся внутри объекта сокетом... Сейчас ставил экспиременты с обычным незащищенным соединением, и пытался серверу передать данные от клиента... серверныый сокет молчал на вызовы функций
То есть некому опрашивать сокеты на то или иное событие, а эти функции всего лишь внешний интерфейс, который можно использовать только в качестве анализа уже отработанных exec-ом событий. Именно поэтому, скорее всего не отрабатывает подтверждение ключа на серверное стороне... Так что всё завязано в недрах qt я вижу это так |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Ничего не понимаю, собрал Qt из репозитория, а прога все-равно не находит QSslSocket.
|
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
попробуй выкачай qt-creator, целиковый под выньду, у меня работал.... у меня нет винды и я никогда не собирал и не ставил qt под винду
я работаю на gentoo, всё компилируя.... проблем вроде не было
флаг выставлен... остальное сам тянет |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Собрал таки. Вот такое вижу в консоли:
//ssl_client
//threadServer
|
||||
|
|||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
SABROG, в каком случае ты это видишь? когда передается в дочерний поток?
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
На самом деле я просто тупо скомпилил сервер и клиент и запустил оба. |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
SABROG, если не сложно... в файле tcpserver.cpp в функции TcpServer :: incomingConnection ( int socketDescriptor ), закомментируй вызов create, а m_SocketThread.add раскомментируй и проверь, будет ли тот же результат... буду благодарен
вот чего тролли написали
бред какой - то... тоже не катит без евентлупа |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |