在一个1000次的循环中构造socket连接到同一端口报以下错误: Error: connect EMFILE
发布于 3年前 作者 zenwong 2976 次浏览
events.js:48
    throw arguments[1]; // Unhandled 'error' event
        ^
Error: connect EMFILE
    at errnoException (net.js:670:11)
    at connect (net.js:548:19)
    at Socket.connect (net.js:613:5)
    at Object.<anonymous> (/Users/zen/Documents/work/game.js:10:5)
    at Module._compile (module.js:446:26)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:31)
    at Function._load (module.js:311:12)
    at Array.<anonymous> (module.js:484:10)
    at EventEmitter._tickCallback (node.js:190:38)

在一个1000次的循环里构造并且连接到1234端口的socket报这个错误,这个错误是linux系统错误:“打开了过多文件”。

想问大家有遇到这个问题吗?

是不是和linux的任何都是文件的概念有关?

6 回复

我对linux的印象是任何IO都是管道,但是管道的API属于FILE。 nodejs关于流的api里和Socket的options里有个文件描述符fd。API中的描述是:

stream.write(string, [encoding], [fd])#
If the optional fd parameter is specified, it is interpreted as an integral file descriptor to be sent over the stream. This is only supported for UNIX streams, and is silently ignored otherwise. When writing a file descriptor in this manner, closing the descriptor before the stream drains risks sending an invalid (closed) FD.

var count = 0;

for(var i =0; i<1000;i++){
    var ss = require('net').Socket({fd:null,type:'tcp4',allowHalfOpen:false});
    ss.connect(1234,function(){
        count++;
        console.log(count);
    });
}

首先,谢谢你。

以上为我的完整代码,我已在生成时将fd设置为null,并且只有connect没有write,这样就不会生成文件描述符了吧。但依然报错。

@zenwong Linux有默认限制socket的个数,1000个已经超过那个数目了。 我在Mac OS X下面打开500个都有这个提示。 可以google一下提高socket限制数目的方法。

@PittMak 我在Linux下的Socket连接数限制已经设为3万多了,但是还是报这个错误

看来我那个redis客户端的问题和这个差不多,应该是同一个 这么大的坑,怎么用啊

回到顶部