从 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 获取所选项目的文本? [复制]