gpt4 book ai didi

Node.js, dgram.setBroadcast(flag) 由于 "EBADF"而失败

转载 作者:IT老高 更新时间:2023-10-28 23:00:32 27 4
gpt4 key购买 nike

我正在使用 Node.js 0.6.9,并且正在尝试发送数据报广播包。代码:

var sys = require('util');
var net = require('net');

var dgram = require('dgram');
var message = new Buffer('message');
var client = dgram.createSocket("udp4");
client.setBroadcast(true);
client.send(message, 0, message.length, 8282, "192.168.1.255", function(err, bytes) {
client.close();
});

运行代码:

$ node test.js
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: setBroadcast EBADF
at errnoException (dgram.js:352:11)
at Socket.setBroadcast (dgram.js:227:11)
at Object.<anonymous> (/home/letharion/tmp/collision/hello.js:25:8)
at Module._compile (module.js:444:26)
at Object..js (module.js:462:10)
at Module.load (module.js:351:32)
at Function._load (module.js:310:12)
at Array.0 (module.js:482:10)
at EventEmitter._tickCallback (node.js:192:41)

一些谷歌搜索reveals “EBADF”表示“套接字参数不是有效的文件描述符”。但我对这个问题的了解还不够,因此无法提供帮助。

最佳答案

首先,您似乎无法理解堆栈跟踪的格式,所以在我们进入此处引发的实际错误之前,让我们先澄清一下。

node.js Stacktrace 的格式

node.js:201
throw e; // process.nextTick error, or 'error' event on first tick

这部分只是NodeJS内部逻辑阻塞并抛出以下错误的位置:

实际的错误堆栈跟踪如下,它首先显示调用堆栈中的最深位置,因此在堆栈跟踪中向下,将带您向上 在调用层次结构中,最终将您带到代码中一切开始的位置。

Error: setBroadcast EBADF
at errnoException (dgram.js:352:11)
at Socket.setBroadcast (dgram.js:227:11)
at Object.<anonymous> (/home/letharion/tmp/collision/hello.js:25:8)
at Module._compile (module.js:444:26)
at Object..js (module.js:462:10)
at Module.load (module.js:351:32)
at Function._load (module.js:310:12)
at Array.0 (module.js:482:10)
at EventEmitter._tickCallback (node.js:192:41)

首先它在 dgram.js on line 352 中失败了, dgram.js 是一个内部 node.js 模块,抽象了“低级”代码。 352 行在一个函数中,该函数包含用于引发错误的通用逻辑。

dgram.js in line 227 上调用它,如果检查哪个包装对包装的 native UDP 套接字 setBroadcast 方法的调用失败。

再往上一层,我们最终会在 25 行的 hello.js 文件中找到 client.setBroadcast(true); 打电话。

剩下的是更多由 hello.js 文件的初始加载产生的 node.js 代码。

实际错误

node.js 在这里封装的原生代码抛出的错误是EBADF looking this up in conjunction with UDP给我们:

EBADF
The socket argument is not a valid file descriptor.

通过进一步深入 node.js 兔子洞,我们最终进入了 udp wrapper ,它包装了 uv wrapper对于实际的 C 实现,在 uv 包装器中我们发现:

/*
* Set broadcast on or off
*
* Arguments:
* handle UDP handle. Should have been initialized with
* `uv_udp_init`.
* on 1 for on, 0 for off
*
* Returns:
* 0 on success, -1 on error.
*/

导致我们得出您的套接字尚未初始化的结论。

最后通过client.bind(8000)绑定(bind)socket,修复了初始化缺失的问题,让程序运行起来了。

关于Node.js, dgram.setBroadcast(flag) 由于 "EBADF"而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com