this.connections = 0;
this.allowHalfOpen = options.allowHalfOpen || false;
-
- this._handle = new TCP();
- this._handle.socket = this;
- this._handle.onconnection = onconnection;
+ this._handle = null;
}
util.inherits(Server, events.EventEmitter);
exports.Server = Server;
function listenip(self, ip, port, addressType) {
var r = 0;
+ // assign handle in listen, and clean up if bind or listen fails
+ self._handle = new TCP();
+ self._handle.socket = this;
+ self._handle.onconnection = onconnection;
+
if (ip && port) {
debug("bind to " + ip);
if (addressType == 6) {
r = self._handle.bind(ip, port);
}
}
-
if (r) {
- self.emit('error', errnoException(errno, 'listen'));
- } else {
- self._handle.listen(self._backlog || 128);
+ self._handle.close();
+ self._handle = null;
+
process.nextTick(function() {
- self.emit('listening');
+ self.emit('error', errnoException(errno, 'listen'));
});
+ } else {
+ r = self._handle.listen(self._backlog || 128);
+ if (r) {
+ self._handle.close();
+ self._handle = null;
+
+ process.nextTick(function() {
+ self.emit('error', errnoException(errno, 'listen'));
+ });
+ } else {
+ process.nextTick(function() {
+ self.emit('listening');
+ });
+ }
}
}
Server.prototype.close = function() {
- this._handle.close();
+ if (this._handle != null) {
+ this._handle.close();
+ this._handle = null;
+ }
};