指向结构的节点 ffi 指针

Posted

技术标签:

【中文标题】指向结构的节点 ffi 指针【英文标题】:Node ffi pointer to struct 【发布时间】:2018-09-20 20:36:32 【问题描述】:

首先,我在这里问是因为对于节点 ffi 中指针的使用和指向结构的指针都没有一个快速的答案,这会有所帮助

这是我的节点 ffi:

const struct_in_addr = Struct(
  's_addr': 'ulong',
);

const struct_sockaddr_in = Struct(
  'sin_family': 'short',
  'sin_port'  : 'ushort',
  'in_addr'   : struct_in_addr,
  'sin_zero'  : 'char',
);


var redir = ffi.Library('./libredir', 
  //'main'           : [ 'int' , [ 'int', 'char* []' ] ],
  //'parse_args'     : [ 'void', [ 'int', 'char* []' ] ],
  'target_init'    : [ 'int' , [ 'char *', 'int', [ struct_sockaddr_in, "pointer" ]] ],
  'target_connect' : [ 'int' , [ 'int', [ struct_sockaddr_in, "pointer" ] ] ],
  'client_accept'  : [ 'int' , [ 'int', [ struct_sockaddr_in, "pointer" ] ] ],
  'server_socket'  : [ 'int' , [ 'char *', 'int', 'int' ] ],
);

以target_init的签名为例:

int target_init(char *addr, int port, struct sockaddr_in *target)

这是我得到的:

/home/lz/redir-controller/node_modules/ref/lib/ref.js:397
    throw new TypeError('could not determine a proper "type" from: ' + JSON.stringify(type))
    ^

TypeError: could not determine a proper "type" from: [null,"pointer"]
    at coerceType (/home/lz/redir-controller/node_modules/ref/lib/ref.js:397:11)
    at Array.map (<anonymous>)

我正在使用https://github.com/troglobit/redir/blob/master/redir.c 并使用gcc -shared -fpic redir.c -o libredir.so 进行编译

我怀疑这是struct_sockaddr_in 的问题,但一切似乎都正常。我什至尝试像https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial#structs 那样做:

const _struct_sockaddr_in = Struct(
  'sin_family': 'short',
  'sin_port'  : 'ushort',
  'in_addr'   : struct_in_addr,
  'sin_zero'  : 'char',
);

struct_sockaddr_in = ref.refType(_struct_sockaddr_in);

但现在我明白了

TypeError: could not determine a proper "type" from: ["indirection":2,"name":"StructType*","pointer"]

【问题讨论】:

【参考方案1】:

我不知道我从哪里得到'pointer',但以下方法有效:

const struct_in_addr = Struct(
  's_addr': 'ulong',
);

const _struct_sockaddr_in = Struct(
  'sin_family': 'short',
  'sin_port'  : 'ushort',
  'in_addr'   : struct_in_addr,
  'sin_zero'  : 'char',
);

struct_sockaddr_in = ref.refType(_struct_sockaddr_in);

const redir = ffi.Library('./libredir', 
  //'main'           : [ 'int' , [ 'int', 'char* []' ] ],
  //'parse_args'     : [ 'void', [ 'int', 'char* []' ] ],
  'target_init'    : [ 'int' , [ 'char *', 'int', struct_sockaddr_in ] ],
  'target_connect' : [ 'int' , [ 'int',  struct_sockaddr_in ] ],
  'client_accept'  : [ 'int' , [ 'int',  struct_sockaddr_in ] ],
  'server_socket'  : [ 'int' , [ 'char *', 'int', 'int' ] ],
);

【讨论】:

以上是关于指向结构的节点 ffi 指针的主要内容,如果未能解决你的问题,请参考以下文章

节点 ffi napi,调用返回 true 但指针中没有结果

JNR-FFI如何从指针读取结构数组

返回指向结构的指针并访问其字段 C++

C和C指针小记(十七)-使用结构和指针

指向结构的指针向量

python中的数据结构-链表