listen/bind errors should close net.Server

This commit is contained in:
Ryan Dahl 2011-01-18 16:22:43 -08:00
parent 2ec4cd5525
commit b22b5e341b
2 changed files with 57 additions and 0 deletions

View File

@ -1020,6 +1020,7 @@ Server.prototype._doListen = function() {
try {
bind(self.fd, arguments[0], arguments[1]);
} catch (err) {
self.close();
self.emit('error', err);
return;
}
@ -1035,6 +1036,7 @@ Server.prototype._doListen = function() {
try {
listen(self.fd, self._backlog || 128);
} catch (err) {
self.close();
self.emit('error', err);
return;
}

View File

@ -0,0 +1,55 @@
// This tests binds to one port, then attempts to start a server on that
// port. It should be EADDRINUSE but be able to then bind to another port.
var common = require('../common');
var assert = require('assert');
var net = require('net');
var connections = 0;
var server1listening = false;
var server2listening = false;
var server1 = net.Server(function (socket) {
connections++;
socket.destroy();
});
var server2 = net.Server(function (socket) {
connections++;
socket.destroy();
});
var server2errors = 0;
server2.on('error', function() {
server2errors++;
console.error("server2 error");
});
server1.listen(common.PORT, function () {
console.error("server1 listening");
server1listening = true;
// This should make server2 emit EADDRINUSE
server2.listen(common.PORT);
// Wait a bit, now try again.
// TODO, the listen callback should report if there was an error.
// Then we could avoid this very unlikely but potential race condition
// here.
setTimeout(function() {
server2.listen(common.PORT + 1, function () {
console.error("server2 listening");
server2listening = true;
server1.close();
server2.close();
});
}, 100);
});
process.on('exit', function() {
assert.equal(1, server2errors);
assert.ok(server2listening);
assert.ok(server1listening);
});