Skip to content

Commit 415d1d6

Browse files
committed
net: add drop event for net server
1 parent 42ad967 commit 415d1d6

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

doc/api/net.md

+21-1
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,26 @@ added: v0.1.90
281281

282282
Emitted when the server has been bound after calling [`server.listen()`][].
283283

284+
### Event: `'drop'`
285+
286+
<!-- YAML
287+
added: REPLACEME
288+
-->
289+
290+
When the number of conenctions reached the threshold(`server.maxConnections`),
291+
the server will drop the connection and emit drop event. If it is a TCP server,
292+
the arguments is as follow.
293+
294+
```json
295+
{
296+
"localAddress": "::ffff:127.0.0.1",
297+
"localPort": 61054,
298+
"remoteAddress": "::ffff:127.0.0.1",
299+
"remotePort": 61060,
300+
"remoteFamily": "IPv6"
301+
}
302+
```
303+
284304
### `server.address()`
285305

286306
<!-- YAML
@@ -316,7 +336,7 @@ const server = net.createServer((socket) => {
316336
server.listen(() => {
317337
console.log('opened server on', server.address());
318338
});
319-
```
339+
````
320340

321341
`server.address()` returns `null` before the `'listening'` event has been
322342
emitted or after calling `server.close()`.

lib/net.js

+15
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,21 @@ function onconnection(err, clientHandle) {
16471647
}
16481648

16491649
if (self.maxConnections && self._connections >= self.maxConnections) {
1650+
const data = {};
1651+
if (clientHandle.getsockname) {
1652+
const localInfo = {};
1653+
clientHandle.getsockname(localInfo);
1654+
data.localAddress = localInfo.address;
1655+
data.localPort = localInfo.port;
1656+
}
1657+
if (clientHandle.getpeername) {
1658+
const remoteInfo = {};
1659+
clientHandle.getpeername(remoteInfo);
1660+
data.remoteAddress = remoteInfo.address;
1661+
data.remotePort = remoteInfo.port;
1662+
data.remoteFamily = remoteInfo.family;
1663+
}
1664+
self.emit('drop', data);
16501665
clientHandle.close();
16511666
return;
16521667
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
const common = require('../common');
3+
const net = require('net');
4+
const assert = require('assert');
5+
6+
let firstSocket;
7+
const server = net.createServer(common.mustCall((socket) => {
8+
firstSocket = socket;
9+
}, 1));
10+
11+
server.maxConnections = 1;
12+
13+
server.on('drop', common.mustCall((data) => {
14+
assert.strictEqual(!!data.localAddress, true);
15+
assert.strictEqual(!!data.localPort, true);
16+
assert.strictEqual(!!data.remoteAddress, true);
17+
assert.strictEqual(!!data.remotePort, true);
18+
assert.strictEqual(!!data.remoteFamily, true);
19+
firstSocket.destroy();
20+
server.close();
21+
}, 1));
22+
23+
server.listen(0, () => {
24+
net.createConnection(server.address().port);
25+
net.createConnection(server.address().port);
26+
});

0 commit comments

Comments
 (0)