通过在红宝石的ioctl获取ESSID
题
要避免依赖于无线工具,我想直接从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
“写”的电话。
不隶属于 StackOverflow