Mercurial > projects > ldc
diff tango/tango/net/MulticastConduit.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/MulticastConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,186 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jun 2004 : Initial release + version: Dec 2006 : South pacific version + + author: Kris + +*******************************************************************************/ + +module tango.net.MulticastConduit; + +public import tango.io.Conduit; + +private import tango.net.DatagramConduit, + tango.net.InternetAddress; + +/****************************************************************************** + + MulticastConduit sends and receives data on a multicast group, as + described by a class-D address. To send data, the recipient group + should be handed to the write() method. To receive, the socket is + bound to an available local adapter/port as a listener and must + join() the group before it becomes eligible for input from there. + + While MulticastConduit is a flavour of datagram, it doesn't support + being connected to a specific endpoint. + + Sending and receiving via a multicast group: + --- + auto group = new InternetAddress ("225.0.0.10", 8080); + + // listen for datagrams on the group address (via port 8080) + auto multi = new MulticastConduit (group); + + // join and broadcast to the group + multi.join.write ("hello", group); + + // we are listening also ... + char[8] tmp; + auto bytes = multi.read (tmp); + --- + + Note that this example is expecting to receive its own broadcast; + thus it may be necessary to enable loopback operation (see below) + for successful receipt of the broadcast. + + Note that class D addresses range from 225.0.0.0 to 239.255.255.255 + + see: http://www.kohala.com/start/mcast.api.txt + +*******************************************************************************/ + +class MulticastConduit : DatagramConduit +{ + private IPv4Address group; + + enum {Host=0, Subnet=1, Site=32, Region=64, Continent=128, Unrestricted=255} + + /*********************************************************************** + + Create a writable multicast socket + + ***********************************************************************/ + + this () + { + super (); + } + + /*********************************************************************** + + Create a read/write multicast socket + + This flavour is necessary only for a multicast receiver + (e.g. use this ctor in conjunction with SocketListener). + + You should specify both a group address and a port to + listen upon. The resultant socket will be bound to the + specified port (locally), and listening on the class-D + address. Expect this to fail without a network adapter + present, as bind() will not find anything to work with. + + The reuse parameter dictates how to behave when the port + is already in use. Default behaviour is to throw an IO + exception, and the alternate is to force usage. + + To become eligible for incoming group datagrams, you must + also invoke the join() method + + ***********************************************************************/ + + this (InternetAddress group, bool reuse = false) + { + super (); + + this.group = group; + socket.setAddressReuse(reuse).bind(new InternetAddress(group.port)); + } + + /*********************************************************************** + + Enable/disable the receipt of multicast packets sent + from the same adapter. The default state is OS specific + + ***********************************************************************/ + + MulticastConduit loopback (bool yes = true) + { + uint[1] onoff = yes; + socket.setOption (SocketOptionLevel.IP, SocketOption.IP_MULTICAST_LOOP, onoff); + return this; + } + + /*********************************************************************** + + Set the number of hops (time to live) of this socket. + Convenient values are + --- + Host: packets are restricted to the same host + Subnet: packets are restricted to the same subnet + Site: packets are restricted to the same site + Region: packets are restricted to the same region + Continent: packets are restricted to the same continent + Unrestricted: packets are unrestricted in scope + --- + + ***********************************************************************/ + + MulticastConduit ttl (uint value=Subnet) + { + uint[1] options = value; + socket.setOption (SocketOptionLevel.IP, SocketOption.IP_MULTICAST_TTL, options); + return this; + } + + /*********************************************************************** + + Add this socket to the listening group + + ***********************************************************************/ + + MulticastConduit join () + { + socket.joinGroup (group, true); + return this; + } + + /*********************************************************************** + + Remove this socket from the listening group + + ***********************************************************************/ + + MulticastConduit leave () + { + socket.joinGroup (group, false); + return this; + } +} + + +/****************************************************************************** + +*******************************************************************************/ + +debug (Multicast) +{ + void main() + { + auto group = new InternetAddress ("225.0.0.10", 8080); + + // listen for datagrams on the group address + auto multi = new MulticastConduit (group); + + // join and broadcast to the group + multi.join.write ("hello", group); + + // we are listening also ... + char[8] tmp; + auto bytes = multi.read (tmp); + } +}