Hello misc@! My goal is send few multicast datagrams via "non-primary network interface" at multihomed host without affecting system wide defaults. After reading man 4 ip: --- For hosts with multiple interfaces, each multicast transmission is sent from the primary network interface. The IP_MULTICAST_IF option overrides the default for subsequent transmissions from a given socket:
struct in_addr addr; setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr)); where addr is the local IP address of the desired interface or INADDR_ANY to specify the default interface. An interface's local IP address and multicast capability can be obtained via the SIOCGIFCONF and SIOCGIFFLAGS ioctl(2)'s. Normal applications should not need to use this option. --- I wrote this simple 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 this code allways give "sendto: No route to host" error. Bad code or I miss something or misunderstood manual page? -- /unk