通过ioctl在ruby中获取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 */ }; 

指针部分必须是存储区的有效地址,后跟长度(以字节为单位),后跟标志字段。 我尝试使用Array#pack和bit-struct 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 

当然,只需将您自己的Ruby友好界面定义为围绕ioctl的包装器(在C中)。 我确实看到了Ruby中默认的ioctl的问题。 我猜ios.ioctl主要用于ioctl “写”调用。

Interesting Posts