Russian Qt Forum

Qt => Работа с сетью => Тема начата: updaite от Сентябрь 02, 2014, 21:01



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


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


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: updaite от Сентябрь 02, 2014, 22:46
Спасибо, но нужно именно вот так.
Код:
QTcpSocket *client
client-> Свойство = true/false


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: Bepec от Сентябрь 02, 2014, 22:48
Не тормозим, делаем обёртку - класс над QTcpSocket. В котором уже указываем что надо.


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: updaite от Сентябрь 02, 2014, 22:56
Bepec, есть класс
Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT
//-------------------
};

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

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

Мне кажется это заморочка того не стоит, мне просто нужно всего одно свойство авторизован или нет, и за этого свойства не хочу программу перестраивать.


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: Bepec от Сентябрь 02, 2014, 23:13
Ну давайте посмотрим архитектуру.

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

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

Ещё вариант - QTcpSocket вроде бы наследник QObject'a с весьма интересным методом "bool QObject::setProperty(const char * name, const QVariant & value)", который позволяет установить объекту пропертю(свойство) с любым содержимым и любым значением :)


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: updaite от Сентябрь 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.


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: updaite от Сентябрь 02, 2014, 23:56
Сделал так если аккаунт есть, присваиваем имя клиенту (Его логин) client->setPeerName("Name"); если нет, не чего не делаем отправляем мол клиент лузер)
Далие проверяем есть ли имя у клиента client->peerName(); если что то вернул то все ок. Для моей задачи этого вполне достаточно) Так и мониторить проще)


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: Bepec от Сентябрь 03, 2014, 00:01
Хорошо что у вас всё хорошо :)
Не понимаете и ладно. :)


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: updaite от Сентябрь 03, 2014, 00:04
Но хорошо было бы привести пример со структурой)) А то малоли чего еще приспичит содержать)
Не понимание в том как получить значение определенного массива структуры если QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
а если быть точнее значение bool authorize; при таком условии.


Название: Re: QTcpSocket свойство для авторизации.
Отправлено: Gregory_E от Март 03, 2018, 17:52
Смысл делать какую то авторизацию в простом не защищённом сокетном соединении, если любой может прочитать все байты переданные по нему.