Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby IOCTL调用中指向缓冲区的指针_Ruby - Fatal编程技术网

Ruby IOCTL调用中指向缓冲区的指针

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

我使用Ruby和bit struct在测试设置中配置网络接口。这对于大多数IOCTL调用都很好,但我不知道如何调用SIOCGIFCONF

以下是一个例子:

如果我想得到一个接口的MAC地址,我会这样写:

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