标签: ioctl

sendto的最大缓冲区长度是多少?

如何获得可以传递给sendto(..)作为UDP端口打开的套接字的调用的最大字节数?

unix sockets networking udp ioctl

7
推荐指数
3
解决办法
1万
查看次数

所有接口的C/C++ Linux MAC地址

我使用以下代码检索当前计算机的所有MAC地址:

ifreq ifr;
ifconf ifc;
char buf[1024];

int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) { ... };

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { ... }

ifreq *it = ifc.ifc_req;
const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));

for (; it != end; ++it) {
    strcpy(ifr.ifr_name, it->ifr_name);
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
        if (!(ifr.ifr_flags & IFF_LOOPBACK)) {
            if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
               unsigned char mac_address[6]; …
Run Code Online (Sandbox Code Playgroud)

c linux ioctl mac-address ifconfig

7
推荐指数
1
解决办法
1万
查看次数

使用linux宏access_ok()有什么意义

我一直在做一些研究,我对这个宏有点困惑.希望有人可以给我一些指导.我有一些ioctl代码(我继承了,没有编写),如果access_ok()在继续从用户空间复制数据之前检查是否它会做的第一件事:

#define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c)
#define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c)

long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
  switch(cmd) {
    case COMMAND:
      if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t)))
        return(retval); 

      if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t)))
        return(retval); 

      argp = &Command;
      __lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t));
Run Code Online (Sandbox Code Playgroud)

所以代码工作正常,但我不确定它是否需要.第一个问题来自access_ok的返回描述:

  • 如果该区域可能可访问,则该函数返回非零(尽管访问仍可能导致-EFAULT).此函数只检查地址是否可能在用户空间中,而不是在内核中.

所以这意味着它真的什么都没做,那么确保我们检查的指针可能在用户空间中被初始化了?既然我们知道除了用户空间调用之外我们不能进入这个功能,除非我们为这个设备打开一个有效的文件描述符,否则它不会发生,这真的需要吗?它确实比确保我们没有得到NULL指针更安全吗?

第二个问题来自这个描述:

  • type参数可以指定为VERIFY_READ或VERIFY_WRITE.VERIFY_WRITE符号还标识内存区域是可读还是可写.

这是否意味着我的代码中的第一次检查是多余的?如果我们要检查可写区域,我们可以作为免费赠品阅读吗?

我正在使用x86架构,所以access_ok()和__range_no_ok()的定义来自/usr/src/linux-3.1.10-1.16/arch/x86/include/asm/uaccess.h,如下所示:

#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))

#define __range_not_ok(addr, size)                  \
({                                  \
    unsigned long flag, roksum;                 \
    __chk_user_ptr(addr);                       \
    asm("add %3,%1 ; sbb …
Run Code Online (Sandbox Code Playgroud)

c linux macros ioctl linux-kernel

7
推荐指数
1
解决办法
1万
查看次数

如何检查界面是否已启动

标题几乎说明了一切.如果我跑ifconfig,我得到这个:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet -snip-  netmask 255.255.255.0  broadcast -snip-
    ...
Run Code Online (Sandbox Code Playgroud)

使用它,我可以知道它是否已启动(<UP,...),但我希望能够在C(或C++,如果有更简单的解决方案)中执行此操作,而不依赖于解析外部进程.


这是我到目前为止所做的(不起作用):

bool is_interface_online(std::string interface) {
    struct ifreq ifr;
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, interface.c_str());
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
            perror("SIOCGIFFLAGS");
    }
    close(sock);
    return !!(ifr.ifr_flags | IFF_UP);
}
Run Code Online (Sandbox Code Playgroud)

任何人都能指出我正确的方向吗?

c++ linux ioctl

7
推荐指数
2
解决办法
1万
查看次数

iwlist()命令如何扫描无线网络?

我想知道iwlist命令如何在linux中扫描可用的无线网络.我读了它的源代码,并且有一个使用SIOCSIWSCAN触发扫描的ioctl调用和SIOCGIWSCAN来获取扫描结果.但是这些系统调用如何捕获和分析信标帧?

linux wireless kernel ioctl

6
推荐指数
1
解决办法
8904
查看次数

用户模式权限被拒绝绑定到套接字

在linux机器上的用户模式[非root]中,我试图通过使用a来绑定套接字ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand).我到了error 13 -> Permission denied because of user mode.如果从usermode更改为内核模式,一切正常.

我只需要在用户模式下绑定套接字.请在解释上述问题时提出解决方案.如果我错过了任何信息,请告诉我,我会提供更多信息.

c sockets ioctl

6
推荐指数
1
解决办法
2万
查看次数

如何异步调用DeviceIOControl代码?

我试图通过使用MSDN上描述的OVERLAPPED结构异步调用DeviceIO函数.我使用FSCTL_ENUM_USN_DATA控制代码枚举NTFS驱动器的MFT,但我不能异步运行它.文件句柄是使用FILE_FLAG_OVERLAPPED创建的,但是我是否使用FILE_FLAG_OVERLAPPED的重叠结构没有区别.该功能不会立即返回.在这两种情况下似乎都是同步的.下面的示例显示了C:\驱动器上前100.000个MFT条目的枚举.由于我不太熟悉重叠结构的使用,我可能做错了.我的问题:如何异步执行DeviceIoControl(hDevice,FSCTL_ENUM_USN_DATA,...)?谢谢你的帮助.

#include "stdafx.h"
#include <Windows.h>

typedef struct {
  DWORDLONG  nextusn;
  USN_RECORD FirstUsnRecord;
  BYTE Buffer[500];
}TDeviceIoControlOutputBuffer, *PTDeviceIoControlOutputBuffer;

int _tmain(int argc, _TCHAR* argv[])
{
    MFT_ENUM_DATA lInputMftData;
    lInputMftData.StartFileReferenceNumber = 0;
    lInputMftData.MinMajorVersion = 2;
    lInputMftData.MaxMajorVersion = 3;
    lInputMftData.LowUsn = 0;
    lInputMftData.HighUsn = 0;

    TDeviceIoControlOutputBuffer lOutputMftData;
    DWORD lOutBytesReturned = 0;
    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    OVERLAPPED  lOverlapped = { 0 };
    lOverlapped.hEvent = hEvent;
    LPCWSTR path = L"\\\\.\\C:";
    HANDLE hDevice = CreateFile(path, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    if …
Run Code Online (Sandbox Code Playgroud)

asynchronous ioctl overlap overlapped-io deviceiocontrol

6
推荐指数
1
解决办法
2081
查看次数

SIOCETHTOOL vs SIOCGMIIPHY vs SIOCGIFFLAGS

经过在互联网上的一些搜索,我发现以下是可用于获取/设置以太网接口参数的选项列表。

  1. SIOCETHTOOL
  2. SIOCGMIIPHY
  3. SIOCGIFFLAGS

我什至看到一些关于SIOCETHTOOL的使用的“stackoverflow”问题。但我的问题是:

  1. 对这三个接口(指 API)在多个内核中提供和支持的功能进行比较。何时应优先选择其中一个选项。
  2. 我几乎找不到SIOCETHTOOL和的文档SIOCGMIIPHY。你能指点一下吗?

c linux ioctl ethernet driver

6
推荐指数
0
解决办法
1407
查看次数

如何从处于低功耗状态的 USB 设备获取字符串描述符?

我正在尝试用 C++ 编写一个应用程序,其中列出从 USB 设备获取的信息。我正在关注 USBView ( Github ) 实用程序的代码。

当设备处于D0电源状态(完全供电)时,我能够获取字符串描述符,但是当设备进入低功耗状态时(D2),我无法获取字符串描述符。

IOCTLIOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION返回错误“连接到系统的设备无法正常工作”。USBView 实用程序显示当设备处于低功耗状态时字符串描述符不可用。

在此输入图像描述

这种行为很奇怪,我在 USB 规范中没有找到任何参考。我检查了两台设备,得到了相同的行为。即使在状态下,我也能够获取其他描述符,例如设备描述符、BOS 描述符等D2

当USB设备处于低功耗状态时,有没有办法获取字符串描述符?如果没有,有没有办法暂时将其转为 D0 电源状态?也许 ACPI 就是答案,但它是一个非常低级的 API,我发现它很难理解。Windows 是否提供任何高级 API 来设置电源状态?

c++ windows usb ioctl acpi

6
推荐指数
1
解决办法
2895
查看次数

venv 内的 python3 给出 termios.error: (25, '不适合设备的 ioctl')

我一直在我创建的虚拟环境中运行 python 脚本pipenv shell,它运行良好。

我总是从 bash 脚本运行该进程,该脚本将目录更改为包含 python 脚本的文件夹,使用 激活 virtualenv pipenv shell,然后运行 ​​python 脚本,然后退出 virtualenv。

但是,我一定在终端中输入了错误的内容并破坏了某些内容,现在当我在虚拟环境中运行脚本时,我得到了这个:

Launching subshell in virtual environment...
Traceback (most recent call last):
  File "/home/manuel/.local/bin/pipenv", line 8, in <module>
    sys.exit(cli())
  File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 610, in invoke
    return callback(*args, …
Run Code Online (Sandbox Code Playgroud)

python linux ioctl tty pipenv

6
推荐指数
0
解决办法
1189
查看次数