NodeJS - dgram error with EBADF
最近把NodeJS從原本的v0.8.x更新到最新的v0.10.x,結果程式就炸了!程式就給我吐出Error: setBroadcast EBADF,結果是dgram炸了,不管是setBroadcast或者是setTTL都一樣會炸掉,問Google大神也問不出答案。
然後我就查了一下EBADF到底是什麼意思,它是一個socket的錯誤碼,原文是The socket argument is not a valid file descriptor.,意思是非法的socket代號,我們來看原本炸掉的程式碼。
#!/usr/bin/env node
'use strict';
var dgram = require('dgram'),
ip = '127.0.0.1',
port = 9000;
client.bind(port);
client.setBroadcast(true);
client.send(message, 0, message.length, port, ip, callback);
接著我就想到會不會是因為EventI/O,所以函式執行完成的先後順序不一致而造成socket的錯誤,雖然已經先執行bind了,但是setBroadcast還是有可能比bind還要先完成。
所以就簡單修改一下程式碼,果不其然它就正常執行了。
#!/usr/bin/env node
'use strict';
var dgram = require('dgram'),
ip = '127.0.0.1',
port = 9000;
client.bind(port, function () {
client.setBroadcast(true);
client.send(message, 0, message.length, port, ip, callback);
});
我將setBroadcast連同send一起寫進bind的callback function確保它是在bind後面執行這樣就正常了。