javascript - Node ffi 指向结构体的指针

标签 javascript c node.js ffi node-ffi

首先,我在这里问是因为对于 Node ffi 中指针的使用以及指向结构的指针都没有快速答案,这将会有所帮助

这是我的 Node 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"]

最佳答案

我不知道我从哪里获取'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' ] ],
});

关于javascript - Node ffi 指向结构体的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49766938/

相关文章:

c - 如何为网格中的所有标签添加 css 样式上下文提供程序?

C Action 和变量

javascript - 如何使用 $(this) 获取动态 DIV 中图像的 src

javascript - JS 对象和函数更正

javascript - 如何使用 jQuery 获取 <span> 的内容?

c - 最后一个内存块中 Calloc 中的垃圾值

node.js - ExpressJS 不使用 app.use 提供静态模板

JavaScript/Node promise : Executing them in sequence

node.js - 在 docker 容器上运行 NOT headless chrome

javascript - Sequelize.js 钩子(Hook) afterBulkCreate 迭代