为了避免依赖无线工具,我想使用 ioctl 直接从设备获取 essid,在 C 中这不会是问题,但在 Ruby 中则完全不同。
问题在于以下结构无线.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 */
};
指针部分必须是内存区域的有效地址,后跟字节长度,最后是标志字段。我尝试使用 Array#pack 和位结构 gem,但尚未找到解决方案。
有没有办法绕过这个内存指针问题?
我终于让它工作了,解决方案是以这种方式使用 pack 的 '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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)