diff --git a/lib/net.js b/lib/net.js index 4930536304..16f3f72d98 100644 --- a/lib/net.js +++ b/lib/net.js @@ -342,11 +342,6 @@ Socket.prototype._destroy = function(exception, cb) { timers.unenroll(this); - if (this.server) { - this.server._connections--; - this.server._emitCloseIfDrained(); - } - debug('close'); if (this._handle) { this._handle.close(); @@ -361,6 +356,11 @@ Socket.prototype._destroy = function(exception, cb) { }); this.destroyed = true; + + if (this.server) { + this.server._connections--; + this.server._emitCloseIfDrained(); + } }; diff --git a/test/simple/test-net-server-close.js b/test/simple/test-net-server-close.js index c3036979f7..b87a84d96f 100644 --- a/test/simple/test-net-server-close.js +++ b/test/simple/test-net-server-close.js @@ -19,22 +19,36 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - - - var common = require('../common'); var assert = require('assert'); var net = require('net'); -var server = net.createServer(function(socket) { - server.close(function() { - assert.equal(server.connections, 0); - }); - process.nextTick(function() { - socket.destroy(); +var events = []; +var sockets = []; + +process.on('exit', function() { + assert.equal(server.connections, 0); + assert.deepEqual(events, 'client client server'.split(' ')); +}); + +var server = net.createServer(function(c) { + c.on('close', function() { + events.push('client'); }); + + sockets.push(c); + + if (sockets.length === 2) { + server.close(); + sockets.forEach(function(c) { c.destroy() }); + } +}); + +server.on('close', function() { + events.push('server'); }); server.listen(common.PORT, function() { net.createConnection(common.PORT); -}); \ No newline at end of file + net.createConnection(common.PORT); +});