首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在红宝石中通过ioctl获取essid

在红宝石中通过ioctl获取essid
EN

Stack Overflow用户
提问于 2009-09-18 20:56:02
回答 2查看 1.6K关注 0票数 3

为了避免依赖无线工具,我想直接从带有ioctl的设备上获得essid,在C中,这不是问题,但在Ruby中则完全不同。

问题是使用wireless.h作为ioctl的输入/回复的结构:

代码语言:javascript
复制
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和位结构创业板,但还没有找到解决方案。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-23 09:32:48

我终于让它起作用了,解决办法是以这样的方式使用pack的'p‘参数:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2009-09-18 22:26:28

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1446806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档