summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShigeki Ohtsu <ohtsu@iij.ad.jp>2012-04-13 16:45:38 +0900
committerBen Noordhuis <info@bnoordhuis.nl>2012-04-16 18:00:47 +0200
commit0d1314233248cb9b236b98477d7b69b2bbf97c08 (patch)
treee08e6a10be32c3c9427ea21dcec4faa9da5b73bd
parent21d26839762c52f20edcfcc245a0cfe1acb21196 (diff)
downloadnode-new-0d1314233248cb9b236b98477d7b69b2bbf97c08.tar.gz
tcp: make getsockname() return address family as string
-rw-r--r--doc/api/net.markdown13
-rw-r--r--doc/api/tls.markdown11
-rw-r--r--src/tcp_wrap.cc5
-rw-r--r--test/simple/test-net-server-address.js58
4 files changed, 76 insertions, 11 deletions
diff --git a/doc/api/net.markdown b/doc/api/net.markdown
index dbfced3e27..6908f61d08 100644
--- a/doc/api/net.markdown
+++ b/doc/api/net.markdown
@@ -168,9 +168,11 @@ event.
### server.address()
-Returns the bound address and port of the server as reported by the operating system.
+Returns the bound address, the address family name and port of the server
+as reported by the operating system.
Useful to find which port was assigned when giving getting an OS-assigned address.
-Returns an object with two properties, e.g. `{"address":"127.0.0.1", "port":2121}`
+Returns an object with three properties, e.g.
+`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`
Example:
@@ -356,9 +358,10 @@ initialDelay will leave the value unchanged from the default
### socket.address()
-Returns the bound address and port of the socket as reported by the operating
-system. Returns an object with two properties, e.g.
-`{"address":"192.168.57.1", "port":62053}`
+Returns the bound address, the address family name and port of the
+socket as reported by the operating system. Returns an object with
+three properties, e.g.
+`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`
### socket.remoteAddress
diff --git a/doc/api/tls.markdown b/doc/api/tls.markdown
index a1fee640d4..a659006479 100644
--- a/doc/api/tls.markdown
+++ b/doc/api/tls.markdown
@@ -323,8 +323,8 @@ event.
### server.address()
-Returns the bound address and port of the server as reported by the operating
-system.
+Returns the bound address, the address family name and port of the
+server as reported by the operating system.
See [net.Server.address()](net.html#server.address) for more information.
### server.addContext(hostname, credentials)
@@ -414,9 +414,10 @@ information.
### cleartextStream.address()
-Returns the bound address and port of the underlying socket as reported by the
-operating system. Returns an object with two properties, e.g.
-`{"address":"192.168.57.1", "port":62053}`
+Returns the bound address, the address family name and port of the
+underlying socket as reported by the operating system. Returns an
+object with three properties, e.g.
+`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`
### cleartextStream.remoteAddress
diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc
index 79535e1e34..e571bc5124 100644
--- a/src/tcp_wrap.cc
+++ b/src/tcp_wrap.cc
@@ -170,6 +170,7 @@ Handle<Value> TCPWrap::GetSockName(const Arguments& args) {
int family;
int port;
char ip[INET6_ADDRSTRLEN];
+ const char *family_name;
UNWRAP
@@ -188,17 +189,19 @@ Handle<Value> TCPWrap::GetSockName(const Arguments& args) {
struct sockaddr_in* addrin = (struct sockaddr_in*)&address;
uv_inet_ntop(AF_INET, &(addrin->sin_addr), ip, INET6_ADDRSTRLEN);
port = ntohs(addrin->sin_port);
+ family_name = "IPv4";
} else if (family == AF_INET6) {
struct sockaddr_in6* addrin6 = (struct sockaddr_in6*)&address;
uv_inet_ntop(AF_INET6, &(addrin6->sin6_addr), ip, INET6_ADDRSTRLEN);
port = ntohs(addrin6->sin6_port);
+ family_name = "IPv6";
} else {
assert(0 && "bad address family");
abort();
}
sockname->Set(port_symbol, Integer::New(port));
- sockname->Set(family_symbol, Integer::New(family));
+ sockname->Set(family_symbol, String::New(family_name));
sockname->Set(address_symbol, String::New(ip));
}
diff --git a/test/simple/test-net-server-address.js b/test/simple/test-net-server-address.js
new file mode 100644
index 0000000000..a9f92c448b
--- /dev/null
+++ b/test/simple/test-net-server-address.js
@@ -0,0 +1,58 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var net = require('net');
+
+// Test on IPv4 Server
+var localhost_ipv4 = '127.0.0.1';
+var family_ipv4 = 'IPv4';
+var server_ipv4 = net.createServer();
+
+server_ipv4.on('error', function(e) {
+ console.log('Error on ipv4 socket: ' + e.toString());
+});
+
+server_ipv4.listen(common.PORT, localhost_ipv4, function() {
+ var address_ipv4 = server_ipv4.address();
+ assert.strictEqual(address_ipv4.address, localhost_ipv4);
+ assert.strictEqual(address_ipv4.port, common.PORT);
+ assert.strictEqual(address_ipv4.family, family_ipv4);
+ server_ipv4.close();
+});
+
+// Test on IPv6 Server
+var localhost_ipv6 = '::1';
+var family_ipv6 = 'IPv6';
+var server_ipv6 = net.createServer();
+
+server_ipv6.on('error', function(e) {
+ console.log('Error on ipv6 socket: ' + e.toString());
+});
+
+server_ipv6.listen(common.PORT, localhost_ipv6, function() {
+ var address_ipv6 = server_ipv6.address();
+ assert.strictEqual(address_ipv6.address, localhost_ipv6);
+ assert.strictEqual(address_ipv6.port, common.PORT);
+ assert.strictEqual(address_ipv6.family, family_ipv6);
+ server_ipv6.close();
+});