SIOCGIWFREQ ioctl 返回错误 22 EINVAL - 参数无效,为什么?
SIOCGIWFREQ ioctl returning error 22 EINVAL - Invalid argument, why?
我正在努力使用 Wireless Extension Tools for Linux library 和以下 Qt/C++
方法读取 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
始终 returns -1
和 errno
设置为 22
的值。我查看了 errno.h 并搜索了错误 22
,我得到了以下错误声明:
#define EINVAL 22 /* Invalid argument */
.
为什么在尝试使用 ioctl
查询网络适配器的当前频道时出现 Invalid argument
错误?我已经 启动了包含此代码的应用程序 作为 普通用户和作为 root,任何时候都相同的结果:
static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) error(iw_get_ext): 22
为什么,我错过了什么?
附录 #1:
如果我使用 iwlist
从终端 扫描 WiFi 卡和网络,我会得到所有需要的信息,无论我 运行 它是否作为 普通用户 或 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)
应用 programming/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
.
问题是否可能与 WiFi
卡 Power Management
有关?
看看cfg80211_wext_giwfreq。这就是为什么如果您的 Wi-Fi
卡未使用任何连接模式.
,您将获得当前频道的 EINVAL
命令 iwlist
扫描有效,因为 Wi-Fi 卡 在扫描时间切换到 AP client mode
。
我正在努力使用 Wireless Extension Tools for Linux library 和以下 Qt/C++
方法读取 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
始终 returns -1
和 errno
设置为 22
的值。我查看了 errno.h 并搜索了错误 22
,我得到了以下错误声明:
#define EINVAL 22 /* Invalid argument */
.
为什么在尝试使用 ioctl
查询网络适配器的当前频道时出现 Invalid argument
错误?我已经 启动了包含此代码的应用程序 作为 普通用户和作为 root,任何时候都相同的结果:
static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) error(iw_get_ext): 22
为什么,我错过了什么?
附录 #1:
如果我使用 iwlist
从终端 扫描 WiFi 卡和网络,我会得到所有需要的信息,无论我 运行 它是否作为 普通用户 或 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)
应用 programming/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
.
问题是否可能与 WiFi
卡 Power Management
有关?
看看cfg80211_wext_giwfreq。这就是为什么如果您的 Wi-Fi
卡未使用任何连接模式.
,您将获得当前频道的 EINVAL
命令 iwlist
扫描有效,因为 Wi-Fi 卡 在扫描时间切换到 AP client mode
。