Официальный форум СВД Встраиваемые Системы
23 Октября, 2018, 11:20:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: QNX 4.25 multicast  (Прочитано 312 раз)
volodya
Пользователь

Сообщений: 11


« : 04 Апреля, 2018, 17:53:19 »

Добрый день!
Помогите разобраться с реализацией мультивещания, немного отредактировал ниже.

Имеются четыре QNX машины (для примера).
ВМ1 192.168.1.10 - источник UDP дейтаграмм
ВМ2 192.168.2.11 - хотим принимать дейтаграммы
ВМ3 192.168.2.12 - хотим принимать дейтаграммы
ВМ4 192.168.1.13 (192.168.2.13 доп. айпи через алиас) - в роли роутера (пересылает трафик участникам мультикаст группы)
       

На ВМ1 написал программу, которая шлет UDP дейтаграммы на адрес группы 239.210.1.2, (порт к примеру 2000).
На ВМ2 и ВМ3 хочу получать данные дейтаграммы.
НА ВМ2 и ВМ3 написал программы которые просто принимают дейтаграммы на свой сокет.(это у меня работало в юникаст режиме)
ВМ4 будет играть роль мультикаст роутера.

Каким образом настроить ВМ4 (мультикаст роутер)?
Каким образом связать ВМ2 и ВМ3 с групповым адрессом? и получать дейтаграммы от ВМ1
Я так понял с mrouted утилитой работать надо но примера конкретного не нашел.
« Последнее редактирование: 04 Апреля, 2018, 19:49:38 от volodya » Записан
Василий Дмитриев
Опытный пользователь

Сообщений: 309



« Ответ #1 : 11 Апреля, 2018, 19:18:11 »

Для начала(если мне конечно не изменяет память, давно боролся с мультикастом на 4-ке) нужно убедиться в том, что используемый сетевой драйвер поддерживает мультикаст. Вроде что-то типа опции -М.
Записан

Санкции! Запрещаю Бараку Обаме и членам конгресса США читать мои посты!
volodya
Пользователь

Сообщений: 11


« Ответ #2 : 12 Апреля, 2018, 10:07:40 »

Драйвер поддерживает, -М опция соответственно задана на всех компах.
Записан
volodya
Пользователь

Сообщений: 11


« Ответ #3 : 12 Апреля, 2018, 12:29:47 »

Подключились к сети, где имеется штатный роутер Asus RT-N16, доставка мультикастовых сообщений выполняется.
Записан
volodya
Пользователь

Сообщений: 11


« Ответ #4 : 12 Апреля, 2018, 17:09:36 »

Вообщем все это заработало в условиях данной задачи:
На всех компах в драйвере должна быть задана опция поддержки мультикаста -М, к примеру:
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;
}


« Последнее редактирование: 12 Апреля, 2018, 17:13:05 от volodya » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2018 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 20 Октября, 2018, 22:50:54