将C结构转换为FFI :: Struct

时间:2010-10-18 19:33:53

标签: ruby libpcap ffi

我在使用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作为名称。

2 个答案:

答案 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;
 }

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