24 #include <arpa/inet.h>
25 #include <netcomm/socket/datagram_multicast.h>
26 #include <netinet/in.h>
27 #include <sys/socket.h>
52 const char * multicast_addr_s,
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);
86 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
87 memcpy(multicast_addr, s.multicast_addr,
sizeof(struct ::sockaddr_in));
97 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
98 memcpy(multicast_addr, datagram_socket.multicast_addr,
sizeof(struct ::sockaddr_in));
109 if (setsockopt(
sock_fd, SOL_SOCKET, SO_REUSEADDR, &reuse,
sizeof(reuse)) == -1) {
114 imr.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
115 imr.imr_interface.s_addr = htonl(INADDR_ANY);
116 if (setsockopt(
sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr,
sizeof(imr)) == -1) {
117 throw SocketException(errno,
"Could not add multicast group membership");
120 struct ::sockaddr_in local;
121 local.sin_family = AF_INET;
122 local.sin_addr.s_addr = INADDR_ANY;
123 local.sin_port = multicast_addr->sin_port;
125 if (::
bind(
sock_fd, (struct ::sockaddr *)&local,
sizeof(local)) < 0) {
126 throw SocketException(errno,
"Could not bind to port");
133 multicast_addr->sin_port = htons(port);
140 free(multicast_addr);
141 multicast_addr = (struct ::sockaddr_in *)malloc(
sizeof(struct ::sockaddr_in));
144 if (inet_aton(hostname, &a) == -1) {
147 multicast_addr->sin_family = AF_INET;
148 multicast_addr->sin_addr.s_addr = a.s_addr;
149 multicast_addr->sin_port = htons(port);
172 Socket::send(buf, buf_len, (struct ::sockaddr *)multicast_addr,
sizeof(struct ::sockaddr_in));
174 e.
append(
"MulticastDatagramSocket::send(void*, unsigned int) failed");
185 int l = (loop ? 1 : 0);
186 if (setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
sizeof(l)) == -1) {
199 if (setsockopt(
sock_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof(ttl)) == -1) {
200 throw SocketException(errno,
"MulticastDatagramSocket::set_ttl: setsockopt failed");