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
後面執行這樣就正常了。