我在使用FFI中的pcap库设置结构时遇到了困难。
STRUCT:
struct pcap_if {
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
bpf_u_int32 flags;
};
相关的Ruby代码
module Pcap
extend FFI::Library
ffi_lib 'pcap'
attach_function :pcap_findalldevs,[:pointer,:string],:int
class Pcap_if < FFI::Struct
layout :next,:pointer,
:name,:string,
:description,:string,
:pcap_addr,:pointer,
:flags,:int
end
end
以上附加功能定义
int pcap_findalldevs(pcap_if_t **, char *)
测试代码(以root身份运行)
tmp=''
ptr = FFI::MemoryPointer.new :pointer
res = Pcap.pcap_findalldevs ptr,tmp
devs = Pcap::Pcap_if.new ptr
puts res
puts devs.offsets
puts devs[:name]
输出
0 #pcap_findalldevs return success
next
0
name
4
description
8
pcap_addr
12
flags
16
pcap.rb:29:in `[]': Memory access offset=4 size=4 is out of bounds (IndexError)
补偿看起来对我来说,但我的C非常生疏。我期待2个设备:lo和eth0作为名称。
答案 0 :(得分:1)
慢帖: 代码应该是这样的:
<div>
<button class="glyphicon glyphicon-menu-up voteButton upvoted">></button>
<h4 class="voteTotal">3</h4>
<button class="glyphicon glyphicon-menu-down voteButton">
<</button>
</div>
<div>
<button class="glyphicon glyphicon-menu-up voteButton upvoted">></button>
<h4 class="voteTotal">10</h4>
<button class="glyphicon glyphicon-menu-down voteButton">
<</button>
</div>
答案 1 :(得分:0)
我找到了解决方案。 FFI无法处理pcap_if_t **。我写了一个C函数来返回一个结构数组。
pcap_if_t* find_devs()
{
pcap_if_t *devs;
char errbuf[PCAP_ERRBUF_SIZE];
int res;
res=pcap_findalldevs(&devs, errbuf);
return devs;
}
我仍然需要处理错误情况,但这确实有效。