From cdb236da6e27111bd8243757960ddb4ae1489869 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Mon, 29 Feb 2016 19:47:14 +0100 Subject: [PATCH] dgram: default send address to 127.0.0.1 or ::1 In net we default to 'localhost' as the default address for connect. Not doing the same on dgram is confusing, because sending to 0.0.0.0 works on Linux/OS X but not on Windows. Defaulting that to 127.0.0.1 / ::1 addresses that. Related: https://github.com/nodejs/node/pull/5407 Related: https://github.com/nodejs/node/issues/5398 Fixes: https://github.com/nodejs/node/issues/5487 --- doc/api/dgram.markdown | 5 +-- lib/dgram.js | 11 ++++-- test/parallel/test-dgram-send-default-host.js | 12 ------- .../test-dgram-udp6-send-default-host.js | 36 +++++++++++++++++++ 4 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 test/parallel/test-dgram-udp6-send-default-host.js diff --git a/doc/api/dgram.markdown b/doc/api/dgram.markdown index d6aa1e36f0195d..8d6de8d7f4b05d 100644 --- a/doc/api/dgram.markdown +++ b/doc/api/dgram.markdown @@ -209,10 +209,7 @@ If `msg` is an array, `offset` and `length` must not be specified. The `address` argument is a string. If the value of `address` is a host name, DNS will be used to resolve the address of the host. If the `address` is not -specified or is an empty string, `'0.0.0.0'` or `'::0'` will be used instead. -It is possible, depending on the network configuration, that these defaults -may not work; accordingly, it is best to be explicit about the destination -address. +specified or is an empty string, `'127.0.0.1'` or `'::1'` will be used instead. If the socket has not been previously bound with a call to `bind`, the socket is assigned a random port number and is bound to the "all interfaces" address diff --git a/lib/dgram.js b/lib/dgram.js index 6937ab636253c0..4b6e7fa6e27666 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -29,12 +29,12 @@ function lookup(address, family, callback) { function lookup4(address, callback) { - return lookup(address || '0.0.0.0', 4, callback); + return lookup(address || '127.0.0.1', 4, callback); } function lookup6(address, callback) { - return lookup(address || '::0', 6, callback); + return lookup(address || '::1', 6, callback); } @@ -166,6 +166,13 @@ Socket.prototype.bind = function(port_ /*, address, callback*/) { exclusive = false; } + // defaulting address for bind to all interfaces + if (!address && self._handle.lookup === lookup4) { + address = '0.0.0.0'; + } else if (!address && self._handle.lookup === lookup6) { + address = '::'; + } + // resolve address first self._handle.lookup(address, function(err, ip) { if (err) { diff --git a/test/parallel/test-dgram-send-default-host.js b/test/parallel/test-dgram-send-default-host.js index 0c50e70f432e30..0d493225132ca4 100644 --- a/test/parallel/test-dgram-send-default-host.js +++ b/test/parallel/test-dgram-send-default-host.js @@ -4,19 +4,8 @@ const common = require('../common'); const assert = require('assert'); const dgram = require('dgram'); -if (common.isWindows) { - // on Windows this test will fail - // see https://github.com/nodejs/node/pull/5407 - console.log('1..0 # Skipped: This test does not apply on Windows.'); - return; -} - const client = dgram.createSocket('udp4'); -const timer = setTimeout(function() { - throw new Error('Timeout'); -}, common.platformTimeout(2000)); - const toSend = [new Buffer(256), new Buffer(256), new Buffer(256), 'hello']; toSend[0].fill('x'); @@ -36,7 +25,6 @@ client.on('message', function(buf, info) { if (toSend.length === 0) { client.close(); - clearTimeout(timer); } }); diff --git a/test/parallel/test-dgram-udp6-send-default-host.js b/test/parallel/test-dgram-udp6-send-default-host.js new file mode 100644 index 00000000000000..f482f8b428b7d0 --- /dev/null +++ b/test/parallel/test-dgram-udp6-send-default-host.js @@ -0,0 +1,36 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const dgram = require('dgram'); + +if (!common.hasIPv6) { + console.log('1..0 # Skipped: no IPv6 support'); + return; +} + +const client = dgram.createSocket('udp6'); + +const toSend = [new Buffer(256), new Buffer(256), new Buffer(256), 'hello']; + +toSend[0].fill('x'); +toSend[1].fill('y'); +toSend[2].fill('z'); + +client.on('listening', function() { + client.send(toSend[0], 0, toSend[0].length, common.PORT); + client.send(toSend[1], common.PORT); + client.send([toSend[2]], common.PORT); + client.send(toSend[3], 0, toSend[3].length, common.PORT); +}); + +client.on('message', function(buf, info) { + const expected = toSend.shift().toString(); + assert.ok(buf.toString() === expected, 'message was received correctly'); + + if (toSend.length === 0) { + client.close(); + } +}); + +client.bind(common.PORT);