How to send multicast datagram via non-default network interface?
I try this:
Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define IFACE_ADDR "192.168.2.1"
#define MCAST_ADDR "239.1.2.3"
#define MCAST_PORT 1234
int main(void)
{
struct sockaddr_in ifaddr, mcaddr;
int sock, on;
char msg[] = "test test test";
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
err(1, "socket");
on = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on) == -1)
err(1, "setsockopt(SO_REUSEADDR)");
ifaddr.sin_addr.s_addr = inet_addr(IFACE_ADDR);
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
&ifaddr.sin_addr.s_addr, sizeof(ifaddr.sin_addr.s_addr)) == -1)
err(1, "setsockopt(IP_MULTICAST_IF)");
memset(&mcaddr, 0, sizeof mcaddr);
mcaddr.sin_family = AF_INET;
mcaddr.sin_addr.s_addr = inet_addr(MCAST_ADDR);
mcaddr.sin_port = (unsigned short)htons(MCAST_PORT);
if (sendto(sock, msg, sizeof msg, 0,
(struct sockaddr *)&mcaddr, sizeof mcaddr) == -1)
err(1, "sendto");
close(sock);
return (0);
}
but allways get "sendto: No route to host".