24 #include <netcomm/socket/datagram_multicast.h>
26 #include <sys/socket.h>
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
53 :
Socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP, timeout)
55 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
58 if ( inet_aton(multicast_addr_s, &a) == -1 ) {
61 multicast_addr->sin_family = AF_INET;
62 multicast_addr->sin_addr.s_addr = a.s_addr;
63 multicast_addr->sin_port = htons(port);
83 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
84 memcpy(multicast_addr, datagram_socket.multicast_addr,
sizeof(struct ::sockaddr_in));
96 if ( setsockopt(
sock_fd, SOL_SOCKET, SO_REUSEADDR, &reuse,
sizeof(reuse)) == -1) {
101 imr.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
102 imr.imr_interface.s_addr = htonl( INADDR_ANY );
103 if ( setsockopt(
sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr,
sizeof(imr)) == -1 ) {
104 throw SocketException(
"Could not add multicast group membership", errno);
107 struct ::sockaddr_in local;
108 local.sin_family = AF_INET;
109 local.sin_addr.s_addr = INADDR_ANY;
110 local.sin_port = multicast_addr->sin_port;
112 if (::
bind(
sock_fd, (struct ::sockaddr *) &local,
sizeof(local)) < 0) {
138 Socket::send(buf, buf_len, (struct ::sockaddr *)multicast_addr,
sizeof(struct ::sockaddr_in));
140 e.
append(
"MulticastDatagramSocket::send(void*, unsigned int) failed");
152 int l = (loop ? 1 : 0);
153 if (setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
sizeof(l)) == -1) {
154 throw SocketException(
"MulticastDatagramSocket::set_loop: setsockopt failed", errno);
165 if ( ttl < 0 ) ttl = -ttl;
166 if ( setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof(ttl) ) == -1 ) {
167 throw SocketException(
"MulticastDatagramSocket::set_ttl: setsockopt failed", errno);