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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket свойство для авторизации.  (Прочитано 7383 раз)
updaite
Гость
« : Сентябрь 02, 2014, 21:01 »

На стороне сервера есть ссылка на сокет клиента
Код:
QTcpSocket *client
у client есть разные свойства client->?.
Хочу сделать одно из свойств идентификатором авторизации, к примеру при авторизации клиента задаем свойству клиента true если нет false.
Вопрос: Какое свойство вобрать наиболее  подходящие? Что бы со стороны клиента это свойство нельзя было перевести в true, можно и числовое свойство 0 или 1. И вообще есть ли подходящие свойство для этого? Не хочу просто эти списки, перебор поиск и прочий гемр))
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Сентябрь 02, 2014, 22:22 »

Вариант с применением списка/множества/массива аутентифицированных сокетов вам не подходит, вы говорите.
Можно тогда сокет делать членом класса/структуры Client (или другое название), где будет поле bool isRegistered, которое будете устанавливать в true, если авторизация прошла успешно. Соответственно на стороне сервера будут храниться не QTcpSocket, а Client, у которого есть разные свойства и можно будет писать код:
Код:
Client* client;
.....
if (client->isRegistered) {
    client->socket->write(data);
}
Или все же словарь QMap<QTcpSocket*, bool> где каждому сокету (ключу), будет установлено значение (зарегистрирован?). По умолчанию (при подключении) равно false, после авторизации меняете на true.
Я не гуру программирования, может кто еще что посоветует.
Записан
updaite
Гость
« Ответ #2 : Сентябрь 02, 2014, 22:46 »

Спасибо, но нужно именно вот так.
Код:
QTcpSocket *client
client-> Свойство = true/false
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 02, 2014, 22:48 »

Не тормозим, делаем обёртку - класс над QTcpSocket. В котором уже указываем что надо.
Записан
updaite
Гость
« Ответ #4 : Сентябрь 02, 2014, 22:56 »

Bepec, есть класс
Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT
//-------------------
};

Как сделать обертку? и как использовать?

Я в QT совсем чуть шарю))

Мне кажется это заморочка того не стоит, мне просто нужно всего одно свойство авторизован или нет, и за этого свойства не хочу программу перестраивать.
« Последнее редактирование: Сентябрь 02, 2014, 23:07 от updaite » Записан
Bepec
Гость
« Ответ #5 : Сентябрь 02, 2014, 23:13 »

Ну давайте посмотрим архитектуру.

У нас есть сервер. У нас есть куча клиентов. Сервер всё равно хранит список клиентов. Почему бы нам не сделать вместо списка клиентов список структур
Код:
struct ClientData
{
QTcpSocket * client;
bool authorize;
}

Далее работаем по стандартному, только у нас появляется свойства authorize. Если уже совсем заморочиться можно переопределить оператор доступа вроде "operator ->()" и будет то что вам надо.

Ещё вариант - QTcpSocket вроде бы наследник QObject'a с весьма интересным методом "bool QObject::setProperty(const char * name, const QVariant & value)", который позволяет установить объекту пропертю(свойство) с любым содержимым и любым значением Улыбающийся
« Последнее редактирование: Сентябрь 02, 2014, 23:15 от Bepec » Записан
updaite
Гость
« Ответ #6 : Сентябрь 02, 2014, 23:21 »

 Спасибо, но
Списки всех клиентов хранятся в QList<QTcpSocket*> m_clients;

    В месте где произошёл сигнал получаю клиента от которого произошёл сигнал.
    QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
    client-> Работа с этим клиентом.

И m_clients много где обрабатывается например
Код:
   while (!m_clients.isEmpty())
    {
        QTcpSocket *client = m_clients.takeFirst();
        client->flush();
        client->close();
        client->deleteLater();
    }

Мне не совсем понятно я как использовать структуру?

Это получается нужно велосипеды делать для структуры, такие как у QList.
« Последнее редактирование: Сентябрь 02, 2014, 23:37 от updaite » Записан
updaite
Гость
« Ответ #7 : Сентябрь 02, 2014, 23:56 »

Сделал так если аккаунт есть, присваиваем имя клиенту (Его логин) client->setPeerName("Name"); если нет, не чего не делаем отправляем мол клиент лузер)
Далие проверяем есть ли имя у клиента client->peerName(); если что то вернул то все ок. Для моей задачи этого вполне достаточно) Так и мониторить проще)
« Последнее редактирование: Сентябрь 03, 2014, 00:00 от updaite » Записан
Bepec
Гость
« Ответ #8 : Сентябрь 03, 2014, 00:01 »

Хорошо что у вас всё хорошо Улыбающийся
Не понимаете и ладно. Улыбающийся
Записан
updaite
Гость
« Ответ #9 : Сентябрь 03, 2014, 00:04 »

Но хорошо было бы привести пример со структурой)) А то малоли чего еще приспичит содержать)
Не понимание в том как получить значение определенного массива структуры если QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
а если быть точнее значение bool authorize; при таком условии.
« Последнее редактирование: Сентябрь 03, 2014, 00:15 от updaite » Записан
Gregory_E
Гость
« Ответ #10 : Март 03, 2018, 17:52 »

Смысл делать какую то авторизацию в простом не защищённом сокетном соединении, если любой может прочитать все байты переданные по нему.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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