ScarShow

< IS >

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一起寫進bindcallback function確保它是在bind後面執行這樣就正常了。