mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
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 PR-URL: https://github.com/nodejs/node/pull/5493 Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io>
This commit is contained in:
parent
a37401e061
commit
8af4bb86c0
@ -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,
|
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
|
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.
|
specified or is an empty string, `'127.0.0.1'` or `'::1'` 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.
|
|
||||||
|
|
||||||
If the socket has not been previously bound with a call to `bind`, the socket
|
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
|
is assigned a random port number and is bound to the "all interfaces" address
|
||||||
|
11
lib/dgram.js
11
lib/dgram.js
@ -29,12 +29,12 @@ function lookup(address, family, callback) {
|
|||||||
|
|
||||||
|
|
||||||
function lookup4(address, 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) {
|
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;
|
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
|
// resolve address first
|
||||||
self._handle.lookup(address, function(err, ip) {
|
self._handle.lookup(address, function(err, ip) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -4,19 +4,8 @@ const common = require('../common');
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const dgram = require('dgram');
|
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 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'];
|
const toSend = [new Buffer(256), new Buffer(256), new Buffer(256), 'hello'];
|
||||||
|
|
||||||
toSend[0].fill('x');
|
toSend[0].fill('x');
|
||||||
@ -36,7 +25,6 @@ client.on('message', function(buf, info) {
|
|||||||
|
|
||||||
if (toSend.length === 0) {
|
if (toSend.length === 0) {
|
||||||
client.close();
|
client.close();
|
||||||
clearTimeout(timer);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
36
test/parallel/test-dgram-udp6-send-default-host.js
Normal file
36
test/parallel/test-dgram-udp6-send-default-host.js
Normal file
@ -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);
|
Loading…
Reference in New Issue
Block a user