要避免依赖于无线工具,我想直接从IOCTL设备得到了ESSID,在C这不会是一个问题,但在Ruby中这是完全不同的。

问题是从下列结构的 wireless.h 被用作IOCTL的输入/答复:

struct  iw_point
{
  void __user *pointer; /* Pointer to the data  (in user space) */
  __u16   length;   /* number of fields or size in bytes */
  __u16   flags;    /* Optional params */
};

在指针部分必须是一个存储区域的有效地址,随后在字节长度,其次是标志字段。我试着用数组#包和位结构的宝石,但还没有找到一个解决办法。

有一种方法绕过这个存储器指针问题?

有帮助吗?

解决方案

我终于得到它的工作,解决方案是使用包装的“P”的说法了这种方式:

require "socket"

# Copied from wireless.h
SIOCGIWESSID      = 0x8B1B
IW_ESSID_MAX_SIZE = 32

iwreq = [ "wlan0", " " * IW_ESSID_MAX_SIZE, IW_ESSID_MAX_SIZE, 0 ].pack("a16pII")

sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)

sock.ioctl(SIOCGIWESSID, iwreq)

interface, essid, len, flags = iwreq.unpack("a16pII")

puts essid

其他提示

当然,只是定义周围的ioctl自己的Ruby界面友好的包装(在C)。我看到的问题在Ruby中默认的ioctl。我想ios.ioctl大多用于ioctl“写”的电话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top