Ruby IOCTL调用中指向缓冲区的指针
我使用Ruby和bit struct在测试设置中配置网络接口。这对于大多数IOCTL调用都很好,但我不知道如何调用SIOCGIFCONF 以下是一个例子: 如果我想得到一个接口的MAC地址,我会这样写:Ruby IOCTL调用中指向缓冲区的指针,ruby,Ruby,我使用Ruby和bit struct在测试设置中配置网络接口。这对于大多数IOCTL调用都很好,但我不知道如何调用SIOCGIFCONF 以下是一个例子: 如果我想得到一个接口的MAC地址,我会这样写: class LinuxIfreqMacAddr < BitStruct char :name, 128 unsigned :type, 16, :endian => :native hex_octets :macaddr, 48 pad
class LinuxIfreqMacAddr < BitStruct
char :name, 128
unsigned :type, 16, :endian => :native
hex_octets :macaddr, 48
pad :padding, 64
end
ifr = LinuxIfreqMacAddr.new
ifr.name = "eth0"
s.ioctl(SIOCGIFHWADDR, ifr) # s is a socket
puts ifr.macaddr
如何使用4096字节的缓冲区从ruby调用SIOCGIFCONF ioctl命令?使用的“p”说明符存储指向
缓冲区:
这是怎么回事
创建ioctl将存储接口信息数组的缓冲区:
ifreqs = ' ' * 4096
现在创建要传递给ioctl调用的缓冲区。缓冲区将是一个
表示以下内容的字符串:
struct-ifconf{
int ifc_len;/*缓冲区大小*/
联合{
char*ifc_buf;/*缓冲区地址*/
结构ifreq*ifc_req;/*结构数组*/
};
};
我们过去经常这样做:
ifconf = [ifreqs.size, ifreqs].pack("l!P")
格式说明符分为:
- “l!”-平台本机大小的签名长字符。这将编码
ifreqs.size
- “p”-指向固定长度缓冲区的指针。这对地址进行了编码
存储在
字符串中的缓冲区ifreqs
SIOCGIFCONF = 0x8912
sock.ioctl(SIOCGIFCONF, ifconf)
SIOCGIFCONF调用修改ifconf缓冲区,将ifc\u len
更新为
ifreqs
buffer中实际存储的数据字节数。我们
您可以通过仅解压缩阵列的该元素看到:
data_size = ifconf.unpack('l!').first
p data_size # => 120
将存储在ifreqs中的数据解码留给
读者
SIOCGIFCONF = 0x8912
sock.ioctl(SIOCGIFCONF, ifconf)
data_size = ifconf.unpack('l!').first
p data_size # => 120