1

我很难从 FFI 中的 pcap 库中设置结构。

结构:

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 作为名称。

4

2 回答 2

1

缓慢的帖子:代码应该是这样的:

ptr = FFI::MemoryPointer.new Pcap::Pcap_if.size
res = Pcap.pcap_findalldevs ptr,tmp
devs = Pcap::Pcap_if.new ptr
于 2015-05-07T20:23:42.997 回答
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;
 }

我仍然需要处理错误情况,但这确实有效。

于 2010-10-19T16:28:48.517 回答