通过ioctl在ruby中获取essid

时间:2009-09-18 20:56:03

标签: ruby wireless bit ioctl

为了避免依赖无线工具,我想直接从设备上用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,但还没有找到解决方案。

有没有办法绕过这个内存指针问题?

2 个答案:

答案 0 :(得分:4)

我终于得到了它的工作,解决方案是以这种方式使用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

答案 1 :(得分:1)

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