24 #include <netcomm/socket/datagram_multicast.h> 26 #include <sys/socket.h> 27 #include <netinet/in.h> 28 #include <arpa/inet.h> 52 const char *multicast_addr_s,
55 :
Socket(addr_type, UDP, timeout)
57 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
60 if ( inet_aton(multicast_addr_s, &a) == -1 ) {
63 multicast_addr->sin_family = AF_INET;
64 multicast_addr->sin_addr.s_addr = a.s_addr;
65 multicast_addr->sin_port = htons(port);
85 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
86 memcpy(multicast_addr, datagram_socket.multicast_addr,
sizeof(struct ::sockaddr_in));
98 if ( setsockopt(
sock_fd, SOL_SOCKET, SO_REUSEADDR, &reuse,
sizeof(reuse)) == -1) {
103 imr.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
104 imr.imr_interface.s_addr = htonl( INADDR_ANY );
105 if ( setsockopt(
sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr,
sizeof(imr)) == -1 ) {
106 throw SocketException(errno,
"Could not add multicast group membership");
109 struct ::sockaddr_in local;
110 local.sin_family = AF_INET;
111 local.sin_addr.s_addr = INADDR_ANY;
112 local.sin_port = multicast_addr->sin_port;
114 if (::
bind(
sock_fd, (struct ::sockaddr *) &local,
sizeof(local)) < 0) {
123 multicast_addr->sin_port = htons(port);
130 const char *hostname)
132 free(multicast_addr);
133 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
136 if ( inet_aton(hostname, &a) == -1 ) {
139 multicast_addr->sin_family = AF_INET;
140 multicast_addr->sin_addr.s_addr = a.s_addr;
141 multicast_addr->sin_port = htons(port);
165 Socket::send(buf, buf_len, (struct ::sockaddr *)multicast_addr,
sizeof(struct ::sockaddr_in));
167 e.
append(
"MulticastDatagramSocket::send(void*, unsigned int) failed");
179 int l = (loop ? 1 : 0);
180 if (setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
sizeof(l)) == -1) {
181 throw SocketException(errno,
"MulticastDatagramSocket::set_loop: setsockopt failed");
192 if ( ttl < 0 ) ttl = -ttl;
193 if ( setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof(ttl) ) == -1 ) {
194 throw SocketException(errno,
"MulticastDatagramSocket::set_ttl: setsockopt failed");
void set_ttl(int ttl)
Set multicast time-to-live (TTL)
Fawkes library namespace.
void set_loop(bool loop)
Set loopback of sent packets.
AddrType
Address type specification.
virtual void bind()
Bind socket.
virtual ~MulticastDatagramSocket()
Destructor.
MulticastDatagramSocket(AddrType addr_type, const char *multicast_addr_s, unsigned short port, float timeout=0.f)
Constructor.
Multicast datagram socket.
int sock_fd
Socket file descriptor.
virtual void send(void *buf, size_t buf_len)
Write to the socket.
virtual void send(void *buf, size_t buf_len)
Send data.
virtual Socket * clone()
Clone socket.
void append(const char *format,...)
Append messages to the message list.