Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
udp: make getsockname() return address family name
  • Loading branch information
Shigeki Ohtsu authored and bnoordhuis committed May 1, 2012
1 parent f4403f9 commit 94f1fee
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
2 changes: 1 addition & 1 deletion doc/api/dgram.markdown
Expand Up @@ -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)

Expand Down
7 changes: 7 additions & 0 deletions src/udp_wrap.cc
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();

Expand All @@ -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;

Expand Down
64 changes: 64 additions & 0 deletions test/simple/test-dgram-address.js
@@ -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.