Получить значение опции сокета SO_RCVBUF из Qt - PullRequest
1 голос
/ 03 апреля 2020

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

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

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

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

Или я допустил ошибку?

1 Ответ

1 голос
/ 03 апреля 2020

Чтобы получить информацию о сокете, должен быть создан собственный сокет, то есть получить 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)
...