Вообщем все это заработало в условиях данной задачи:
На всех компах в драйвере должна быть задана опция поддержки мультикаста -М, к примеру:
Net.ether82557 -М
На ВМ1(источник мультикаста) необходимо прописать маршрут к ВМ4(условный роутер):
route add 239.210.1.2 192.168.1.13
На ВМ4(192.168.1.13) поднять доп айпи адрес:
ifconfig en1 alias 192.168.2.13
Код ВМ1 (источник мультикаст сообщения):#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/dev.h>
#include <sys/name.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <stdlib.h>
#include <i86.h>
#include <time.h>
#include <signal.h>
#include <sys/proxy.h>
#include <sys/kernel.h>
#include <process.h>
#define MAXBUF 256
//port
#define PORT 2000
#define GROUP "239.210.1.2"
int main(int argc, char *argv[])
{
char loopch = 0;
char buf[MAXBUF] = "Multicast message lol lol lol!";
int sd, datalen = sizeof(buf);
struct sockaddr_in groupSock;
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("open socket error");
return 1;
}
else printf("open sock OK\n");
memset((char*)&groupSock, 0, sizeof(groupSock));
groupSock.sin_family = AF_INET;
groupSock.sin_addr.s_addr = inet_addr(GROUP);
groupSock.sin_port = htons(PORT);
if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&loopch, sizeof(loopch)) < 0)
{
perror("looping disable error\n");
close(sd);
return 1;
}
else printf("looping disable ok\n");
if(sendto(sd, buf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0)
{
perror("send error\n");
return 1;
}
else printf("send ok\n");
return 0;
}
Код ВМ2(принимаем дейтаграммы):(инклуды те же, что и в отправителе)
#define MAXBUF 256
//port
#define PORT 2000
#define GROUP "239.210.1.2"
int main(int argc, char *argv[])
{
struct sockaddr_in local;
struct ip_mreq group;
int sd, datalen;
char buf[MAXBUF];
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket open error");
return 1;
}
else printf("socket open ok\n");
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = INADDR_ANY;
if (bind(sd, (struct sockaddr *)&local, sizeof(local)) < 0)
{
perror("bind error");
return 1;
}
else printf("bind ok\n");
group.imr_multiaddr.s_addr = inet_addr(GROUP);
group.imr_interface.s_addr = inet_addr("192.168.2.11");
if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&group, sizeof(group)) < 0)
{
perror("add membership error");
return 1;
}
else printf("add membership ok\n");
datalen = sizeof(buf);
if(read(sd, buf, datalen) < 0)
{
perror("read error");
return 1;
}
else printf(">> %s\n", buf);
return 0;
}