summaryrefslogtreecommitdiff
path: root/ace/SOCK_Dgram_Mcast.h
blob: 4e2f81651424e76b6228d734c09cc4184200067f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    ace
// 
// = FILENAME
//    SOCK_Dgram_Mcast.h
//
// = AUTHORS
//    Irfan Pyrali (ip1@cs.wustl.edu)
//    Tim Harrison (harrison@cs.wustl.edu)
// 
// ============================================================================

#if !defined (ACE_SOCK_DGRAM_MCAST_H)
#define ACE_SOCK_DGRAM_MCAST_H

#include "ace/SOCK_Dgram.h"
#include "ace/INET_Addr.h"

class ACE_Export ACE_SOCK_Dgram_Mcast : public ACE_SOCK_Dgram
{
  // = TITLE
  //     Defines the member functions for the ACE SOCK wrapper
  //     multicast abstraction. 
public:
  // = Initialization routine.
  ACE_SOCK_Dgram_Mcast (void);
  // Note that there is no open ().  This cannot be used unless you
  // subscribe to the multicast group.  If you just want to send (and
  // not listen) to the multicast group, use ACE_SOCK_Dgram or
  // ACE_SOCK_CODgram.

  ~ACE_SOCK_Dgram_Mcast (void);
  // Default dtor.

  // = Multicast group management routines.

  int subscribe (const ACE_INET_Addr &mcast_addr,
		 int reuse_addr = 1,
		 const ASYS_TCHAR *net_if = 0,
		 int protocol_family = PF_INET,
		 int protocol = 0);
  // Join a multicast group by telling the network interface device
  // driver to accept datagrams with ACE_INET_Addr &mcast_addr
  // multicast addresses.
  // 
  // If you have called open already, subscribe closes the socket and
  // opens a new socket bound to the mcast_addr.
  //
  // Interface is hardware specific. use netstat -i to find whether
  // your interface is, say, le0 or something else.  If net_if == 0,
  // subscribe uses the default mcast interface.
  // Returns: -1 on error, else 0.

  int unsubscribe (void);
  // Unsubscribe from a multicast group.  Returns 0 on success, -1 on
  // failure.

  // = Data transfer routines.
  ssize_t send (const void *buf, size_t n, int flags = 0) const;
  // Send <n> bytes in <buf>.

  ssize_t send (const iovec iov[], size_t n, int flags = 0) const;
  // Send <n> <iovecs>.

  // = Options.
  int set_option (int option, char optval);
  // Set an ip option that takes a char as input.
  // e.g. IP_MULTICAST_LOOP.  This is just a nice interface to a
  // subset of possible setsockopt/ACE_SOCK::set_option calls Returns
  // 0 on success, -1 on failure.

  void dump (void) const;
  // Dump the state of an object.

  ACE_ALLOC_HOOK_DECLARE;
  // Declare the dynamic allocation hooks.

private:
  ACE_HANDLE open (const ACE_Addr &local, 
		   int protocol_family = PF_INET, 
		   int protocol = 0);
  // disable public use of ACE_SOCK_Dgram::open ()

  // = Disable public use of ACE_SOCK_Dgram::sends and force
  // ACE_SOCK_Dgram_Mcast::sends inline
  ssize_t send (const void *buf, 
		size_t n, 
		const ACE_Addr &addr, 
		int flags = 0) const;
  ssize_t send (const iovec iov[], 
		size_t n, 
		const ACE_Addr &addr, 
		int flags = 0) const;

  int make_multicast_address (const ACE_INET_Addr &mcast_addr,
			      const ASYS_TCHAR *net_if = ASYS_TEXT ("le0"));
  // Initialize a multicast address.

  ACE_INET_Addr mcast_addr_;
  // Multicast group address.

  struct ip_mreq multicast_address_;
  // IP address.
}; 

#if !defined (ACE_LACKS_INLINE_FUNCTIONS)
#include "ace/SOCK_Dgram_Mcast.i"
#endif

#endif /* ACE_SOCK_DGRAM_MCAST_H */