Permalink
Browse files

udp: make getsockname() return address family name

  • Loading branch information...
1 parent f4403f9 commit 94f1feeb5989d20372c8025b7284b4c1d26ab812 @shigeki shigeki committed with bnoordhuis May 1, 2012
Showing with 72 additions and 1 deletion.
  1. +1 −1 doc/api/dgram.markdown
  2. +7 −0 src/udp_wrap.cc
  3. +64 −0 test/simple/test-dgram-address.js
View
@@ -144,7 +144,7 @@ Close the underlying socket and stop listening for data on it.
### dgram.address()
Returns an object containing the address information for a socket. For UDP sockets,
-this object will contain `address` and `port`.
+this object will contain `address` , `family` and `port`.
### dgram.setBroadcast(flag)
View
@@ -67,6 +67,7 @@ Local<Object> AddressToJS(const sockaddr* addr);
static Persistent<String> address_symbol;
static Persistent<String> port_symbol;
+static Persistent<String> family_symbol;
static Persistent<String> buffer_sym;
static Persistent<String> oncomplete_sym;
static Persistent<String> onmessage_sym;
@@ -134,6 +135,7 @@ void UDPWrap::Initialize(Handle<Object> target) {
address_symbol = NODE_PSYMBOL("address");
oncomplete_sym = NODE_PSYMBOL("oncomplete");
onmessage_sym = NODE_PSYMBOL("onmessage");
+ family_symbol = NODE_PSYMBOL("family");
Local<FunctionTemplate> t = FunctionTemplate::New(New);
t->InstanceTemplate()->SetInternalFieldCount(1);
@@ -447,6 +449,7 @@ Local<Object> AddressToJS(const sockaddr* addr) {
const sockaddr_in *a4;
const sockaddr_in6 *a6;
int port;
+ const char *family_name;
Local<Object> info = Object::New();
@@ -455,15 +458,19 @@ Local<Object> AddressToJS(const sockaddr* addr) {
a6 = reinterpret_cast<const sockaddr_in6*>(addr);
uv_inet_ntop(AF_INET6, &a6->sin6_addr, ip, sizeof ip);
port = ntohs(a6->sin6_port);
+ family_name = "IPv6";
info->Set(address_symbol, String::New(ip));
+ info->Set(family_symbol, String::New(family_name));
info->Set(port_symbol, Integer::New(port));
break;
case AF_INET:
a4 = reinterpret_cast<const sockaddr_in*>(addr);
uv_inet_ntop(AF_INET, &a4->sin_addr, ip, sizeof ip);
port = ntohs(a4->sin_port);
+ family_name = "IPv4";
info->Set(address_symbol, String::New(ip));
+ info->Set(family_symbol, String::New(family_name));
info->Set(port_symbol, Integer::New(port));
break;
@@ -0,0 +1,64 @@
+// 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 dgram = require('dgram');
+
+// IPv4 Test
+var localhost_ipv4 = '127.0.0.1';
+var socket_ipv4 = dgram.createSocket('udp4');
+var family_ipv4 = 'IPv4';
+
+socket_ipv4.on('listening', function() {
+ var address_ipv4 = socket_ipv4.address();
+ assert.strictEqual(address_ipv4.address, localhost_ipv4);
+ assert.strictEqual(address_ipv4.port, common.PORT);
+ assert.strictEqual(address_ipv4.family, family_ipv4);
+ socket_ipv4.close();
+});
+
+socket_ipv4.on('error', function(e) {
+ console.log('Error on udp4 socket. ' + e.toString());
+ socket_ipv4.close();
+});
+
+socket_ipv4.bind(common.PORT, localhost_ipv4);
+
+// IPv6 Test
+var localhost_ipv6 = '::1';
+var socket_ipv6 = dgram.createSocket('udp6');
+var family_ipv6 = 'IPv6';
+
+socket_ipv6.on('listening', function() {
+ var address_ipv6 = socket_ipv6.address();
+ assert.strictEqual(address_ipv6.address, localhost_ipv6);
+ assert.strictEqual(address_ipv6.port, common.PORT);
+ assert.strictEqual(address_ipv6.family, family_ipv6);
+ socket_ipv6.close();
+});
+
+socket_ipv6.on('error', function(e) {
+ console.log('Error on udp6 socket. ' + e.toString());
+ socket_ipv6.close();
+});
+
+socket_ipv6.bind(common.PORT, localhost_ipv6);

0 comments on commit 94f1fee

Please sign in to comment.