diff --git a/lib/dgram.js b/lib/dgram.js index d548ea2fb1c..d5c2e0da69c 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -237,7 +237,11 @@ Socket.prototype.setTTL = function(arg) { Socket.prototype.setMulticastTTL = function(arg) { - throw new Error('not yet implemented'); + if (this._handle.setMulticastTTL(arg) == -1) { + throw errnoException(errno, 'setMulticastTTL'); + } + + return true; }; diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index e73f634cde6..e1be2d92da1 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -93,6 +93,7 @@ public: static Handle GetSockName(const Arguments& args); static Handle AddMembership(const Arguments& args); static Handle DropMembership(const Arguments& args); + static Handle SetMulticastTTL(const Arguments& args); static Handle SetBroadcast(const Arguments& args); private: @@ -154,6 +155,7 @@ void UDPWrap::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(t, "getsockname", GetSockName); NODE_SET_PROTOTYPE_METHOD(t, "addMembership", AddMembership); NODE_SET_PROTOTYPE_METHOD(t, "dropMembership", DropMembership); + NODE_SET_PROTOTYPE_METHOD(t, "setMulticastTTL", SetMulticastTTL); NODE_SET_PROTOTYPE_METHOD(t, "setBroadcast", SetBroadcast); target->Set(String::NewSymbol("UDP"), @@ -260,6 +262,20 @@ Handle UDPWrap::DropMembership(const Arguments& args) { return SetMembership(args, UV_LEAVE_GROUP); } +Handle UDPWrap::SetMulticastTTL(const Arguments& args) { + HandleScope scope; + UNWRAP + + assert(args.Length() == 1); + + int ttl = args[0]->Uint32Value(); + int r = uv_udp_set_multicast_ttl(&wrap->handle_, ttl); + + if (r) + SetErrno(uv_last_error(uv_default_loop())); + + return scope.Close(Integer::New(r)); +} Handle UDPWrap::DoSend(const Arguments& args, int family) { HandleScope scope; diff --git a/test/simple/test-dgram-multicast-setTTL.js b/test/simple/test-dgram-multicast-setTTL.js new file mode 100644 index 00000000000..a2207a78d00 --- /dev/null +++ b/test/simple/test-dgram-multicast-setTTL.js @@ -0,0 +1,41 @@ +// 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'), + assert = require('assert'), + dgram = require('dgram'), + thrown = false, + socket = dgram.createSocket('udp4'); + +socket.bind(common.PORT); +socket.setMulticastTTL(16); + +//Try to set an invalid TTL (valid ttl is > 0 and < 256) +try { + socket.setMulticastTTL(1000); +} catch (e) { + thrown = true; +} + +assert(thrown, 'Setting an invalid mutlicast TTL should throw some error'); + +//close the socket +socket.close(); \ No newline at end of file