diff options
author | Ouyang Yadong <oyydoibh@gmail.com> | 2018-10-21 15:59:38 +0800 |
---|---|---|
committer | Ouyang Yadong <oyydoibh@gmail.com> | 2018-11-22 21:45:08 +0800 |
commit | 33a25b29a4d654f5c2a5c74725862bccb2fcccfb (patch) | |
tree | a963b15bcba72cabfb317cbb00e47ff33753fbd9 /test/parallel/test-cluster-dgram-ipv6only.js | |
parent | 91748dd89c652939d52f38b94afe9eae4eb8fd5d (diff) | |
download | android-node-v8-33a25b29a4d654f5c2a5c74725862bccb2fcccfb.tar.gz android-node-v8-33a25b29a4d654f5c2a5c74725862bccb2fcccfb.tar.bz2 android-node-v8-33a25b29a4d654f5c2a5c74725862bccb2fcccfb.zip |
net,dgram: add ipv6Only option for net and dgram
For TCP servers, the dual-stack support is enable by default, i.e.
binding host "::" will also make "0.0.0.0" bound. This commit add
ipv6Only option in `net.Server.listen()` and `dgram.createSocket()`
methods which allows to disable dual-stack support. Support for
cluster module is also provided in this commit.
Fixes: https://github.com/nodejs/node/issues/17664
PR-URL: https://github.com/nodejs/node/pull/23798
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test/parallel/test-cluster-dgram-ipv6only.js')
-rw-r--r-- | test/parallel/test-cluster-dgram-ipv6only.js | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/parallel/test-cluster-dgram-ipv6only.js b/test/parallel/test-cluster-dgram-ipv6only.js new file mode 100644 index 0000000000..0906baec92 --- /dev/null +++ b/test/parallel/test-cluster-dgram-ipv6only.js @@ -0,0 +1,51 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasIPv6) + common.skip('no IPv6 support'); +if (common.isWindows) + common.skip('dgram clustering is currently not supported on windows.'); + +const assert = require('assert'); +const cluster = require('cluster'); +const dgram = require('dgram'); + +// This test ensures that the `ipv6Only` option in `dgram.createSock()` +// works as expected. +if (cluster.isMaster) { + cluster.fork().on('exit', common.mustCall((code) => { + assert.strictEqual(code, 0); + })); +} else { + let waiting = 2; + function close() { + if (--waiting === 0) + cluster.worker.disconnect(); + } + + const socket1 = dgram.createSocket({ + type: 'udp6', + ipv6Only: true + }); + const socket2 = dgram.createSocket({ + type: 'udp4', + }); + socket1.on('error', common.mustNotCall()); + socket2.on('error', common.mustNotCall()); + + socket1.bind({ + port: 0, + address: '::', + }, common.mustCall(() => { + const { port } = socket1.address(); + socket2.bind({ + port, + address: '0.0.0.0', + }, common.mustCall(() => { + process.nextTick(() => { + socket1.close(close); + socket2.close(close); + }); + })); + })); +} |