从 Qt 获取 SO_RCVBUF 套接字选项值

Posted

技术标签:

【中文标题】从 Qt 获取 SO_RCVBUF 套接字选项值【英文标题】:Get SO_RCVBUF socket option value from Qt 【发布时间】:2020-07-15 17:08:16 【问题描述】:

我想获取 Qt 使用的 SO_RCVBUF 套接字选项的值,以确保它默认使用系统值(我已更改)。

但以下代码返回“无效”QVariant:

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

这是否意味着socketOption() Qt 方法只有在设置了setSocketOption() 时才能获取该值?

还是我弄错了?

【问题讨论】:

【参考方案1】:

为了获取套接字信息,必须已经创建了本机套接字,即获取一个非-1的socketDescriptor(),但在你的情况下它没有连接导致该值不被读取,返回无效的 QVariant。

解决方法是连接socket,分析socket是否有效,获取想要的信息:

#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)

【讨论】:

感谢@eyllanesc 的回答。我们确定socketOption() 返回的值被套接字考虑了吗​​?例如,如果我们设置的值不是 4096 的倍数,我猜该值不会被套接字使用,因为无效 @AlexandreD。嗯,我不明白你。 QXSocket 是原生套接字的封装,因此像 socketOption 这样的方法将在内部使用原生套接字,因此由于没有连接,所以原生套接字将不存在,因此无法使用 setSocketOption 和 socketOption。 完全可以。我的问题现在与上面的问题不同。我知道我需要一个套接字描述符才能设置套接字选项。但是我们确定从 socketOption 接收到的值实际上是由我们的原生套接字使用的吗? @AlexandreD。是的,我敢肯定。我建议您检查 Qt 源代码,以便您可以根据您的操作系统进行分析。对于 linux 你可以查看github.com/qt/qtbase/blob/5.14.2/src/network/socket/…

以上是关于从 Qt 获取 SO_RCVBUF 套接字选项值的主要内容,如果未能解决你的问题,请参考以下文章

即使对于“pktcount * pktsize”< SO_RCVBUF,linux socket recv 缓冲区数据包也会丢失

ROS取数线程分析: 不带组装: socket选项SO_SNDBUF,SO_RCVBUF对带宽和CPU的影响

ROS取数线程分析: 不带组装: socket选项SO_SNDBUF,SO_RCVBUF对带宽和CPU的影响

如何从 QT 中的 QListView 获取所选项目的文本? [复制]

如何从 Qt 上的 QTabWidget 获取 currentTabName?

Qt - 在QGraphicScene中拖放时如何从项目中获取文本?