Получить значение параметра сокета SO_RCVBUF из Qt

Я хочу получить значение параметра сокета SO_RCVBUF, используемого Qt, чтобы быть уверенным, что он по умолчанию использует системное значение (которое я изменил).

Но следующий фрагмент кода возвращает "Invalid" QVariant:

QUdpSocket socket;
qDebug() << socket.socketOption(QAbstractSocket::ReceiveBufferSizeSocketOption);

Означает ли это, что socketOption() Метод Qt получает значение, только если оно было установлено с помощью setSocketOption()?

Или я ошибся?

1 ответ

Решение

Чтобы получить информацию о сокете, должен быть создан собственный сокет, то есть получить socketDescriptor(), отличный от -1, но в вашем случае он не подключен, в результате чего это значение не читается, возвращая недопустимый QVariant.

Решение состоит в том, чтобы подключить сокет и проанализировать его допустимость для получения желаемой информации:

#include <QCoreApplication>
#include <QTimer>
#include <QUdpSocket>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QUdpSocket socket;
    QObject::connect(&socket, &QAbstractSocket::stateChanged, [&socket](){
        if(socket.socketDescriptor() != -1){
            qDebug() << socket.socketOption(QAbstractSocket::ReceiveBufferSizeSocketOption);
            // kill application
            QTimer::singleShot(1000, &QCoreApplication::quit);
        }
    });
    socket.bind(QHostAddress::LocalHost, 1234);
    return a.exec();
}

Выход:

QVariant(int, 212992)
Другие вопросы по тегам