SIOCGIWFREQ ioctl返回错误22 EINVAL – 无效的参数,为什么?

我正努力使用以下Qt/C++方法使用Wireless Extension Tools for Linux库来读取Wifi卡的当前频道:

 const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString& interfaceName) { static UeTypeCurrentFrequencyChannel result=UeTypeCurrentFrequencyChannel(); iwreq wrq; iw_range range; int kernelSocket=iw_sockets_open(); if(iw_get_range_info(kernelSocket, interfaceName.toLocal8Bit().constData(), &range)>=0) { if(iw_get_ext(kernelSocket, interfaceName.toLocal8Bit().constData(), SIOCGIWFREQ, &wrq)>=0) { //BUG current frequency and channel is not read, it might be becuase of nonroot credentials - it returns error 22 (EINVAL - Invalid argument), why? result.first=iw_freq2float(&(wrq.u.freq)); result.second=iw_freq_to_channel(result.first.toDouble(), &range); qDebug() << Q_FUNC_INFO << "success - current channel:" << result; } else { result.first=QString(interfaceName); result.second=QString(tr("current channel read failed.")); qDebug() << Q_FUNC_INFO << "error (iw_get_ext):" << errno; } // if } else { result.first=QString(interfaceName); result.second=QString(tr("current channel read failed.")); qDebug() << Q_FUNC_INFO << "error (iw_get_range_info):" << errno; } // if iw_sockets_close(kernelSocket); return result; } // ueCurrentFrequencyChannel 

现在, iw_get_ext总是返回-1errno被设置为22值。 我看了一下errno.h,并search错误22 ,我有下面的错误声明:
#define EINVAL 22 /* Invalid argument */
为什么在尝试使用ioctl查询networking适配器的当前频率信道时出现Invalid argument错误? 我已经启动了包含这个代码的应用程序作为普通用户,

 static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) error(iw_get_ext): 22 

为什么,我错过了什么?

附录#1:
如果我使用iwlist 从terminal扫描WiFi卡和networking,我会得到所有需要的信息,无论是以普通用户还是root 用户身份运行。

附录#2:代码已经升级, iw_get_range_info()工作。

附录#3:情况刚刚好; 随机的场合,我得到了成功:

 static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) success - current channel: QPair(QVariant(double, 2.412e+09),QVariant(int, 1)) 

iwlist scan output相同:

 wlan0 Scan completed : Cell 01 - Address: 64:6E:EA:22:21:D4 Channel:1 Frequency:2.412 GHz (Channel 1) 

经过一段时间的编程/testing应用程序,错误再次出现,但iwlist scan仍然有效。 我正在使用Ubuntu 16.04.1 LTS和内核Linux workstation 4.4.0-38-generic #57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
这可能是可能的问题有关的WiFiPower Management

看看cfg80211_wext_giwfreq 。 因此,如果您的Wi-Fi卡未使用任何连接模式,您将获得当前频道的EINVAL
命令iwlist扫描工作,因为Wi-Fi卡在扫描时间切换到AP client mode