LINUX.ORG.RU

udp multicast


1

1

Необходимо по udp multicast передать данные. Мне дали дали групповой IP и порт. С помощью гула накидал следующее:


struct in_addr localInterface;
struct sockaddr_in localSock, groupSock;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

//---- Биндим докальный адрес и порт
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(6400); // номер моего порта

if (sourceAddress.isEmpty())
        localSock.sin_addr.s_addr = INADDR_ANY;
    else
        localSock.sin_addr.s_addr = inet_addr(sourceAddress.toStdString().c_str());
    bind(sockfd, (struct sockaddr*)&localSock, sizeof(localSock))
// ---------- Устанавливаю групповые адрес и порт приемника, которые мне выдали
memset((char *) &groupSock, 0, sizeof(groupSock));
groupSock.sin_family = AF_INET;
groupSock.sin_addr.s_addr = inet_addr("224.211.1.9");
groupSock.sin_port = htons(6490);
// ---------- Устанавливаю локальный интерфейс для передачи multicast datagrams
if (sourceAddress.isEmpty())
     localInterface.s_addr = INADDR_ANY;
    else
        localInterface.s_addr = inet_addr(sourceAddress.toStdString().c_str());
if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0)
// -------------- Выдаю данные
int n = sendto(sockfd, datagram, size, 0, (struct sockaddr*)&groupSock, sizeof(groupSock))

Здесь, все проверки опустил. Все команды выполняются успешно. А sendto выдает n, равное реальному количеству переданных байт. Но приемник данные не принимает ( Подскажите, кто разбирается, из-за чего данные могут не приниматься (не доходить) ? Чего еще в передатчике не хватает ?, флаги может какие ? Приемник точно рабочий - данные на него выдают, но код передатчика мне не доступен.


Ответ на: комментарий от nokachi

На машине, где стоит клиент tcpdump'a нет и установить не получится.

drZlo ()

а IGMP сообщения кто отсылать будет?

TOXA ★★ ()
Последнее исправление: TOXA (всего исправлений: 1)

Не вижу установки TTL. Не уверен, что она нужна, но всё же.

tailgunner ★★★★★ ()
Ответ на: комментарий от TOXA

а IGMP сообщения кто отсылать будет?

Ядро автоматически.

tailgunner ★★★★★ ()
Ответ на: комментарий от drZlo

прошу прощения, сразу не заметил, все нормально... вроде бы

TOXA ★★ ()
Ответ на: комментарий от drZlo

На машине, где стоит клиент tcpdump'a нет и установить не получится.

Поставь на любую другую.

tailgunner ★★★★★ ()
Ответ на: комментарий от drZlo

из того же примера возьмите сервер и проверьте, будет ли он получать отправляемые дейтаграммы

TOXA ★★ ()
Ответ на: комментарий от TOXA

Это имелось ввиду ?

setsockopt(MSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipMreq, sizeof(ipMreq));
По-моему только на сервер нужно.

drZlo ()
Ответ на: комментарий от drZlo

По умолчанию = 1, вроде можно не менять.

У меня в программе стоит зачем-то :) Твой клиент в той же физической сети?

tailgunner ★★★★★ ()
Ответ на: комментарий от drZlo

Вообще, взглянув внимательнее на твой код... мне кажется, я делал не так. Я вообще не делал bind.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Думаю это не принципиально (хотя можно попробовать без). В примерах для передатчика, кто делает, кто - нет. Для приемника надо.

drZlo ()

net.ipv4.conf.all.rp_filter = 0

mv ★★★★★ ()
Ответ на: комментарий от mv

Эта переменная сообщает ядру о необходимости фильтрации пакетов по их исходящему адресу.

Разве это может помочь ? В бубунте, например, в /etc/sysctl.conf закоментировано.

drZlo ()
Ответ на: комментарий от drZlo

В какое значение на твоей бубунте установлено?

mv ★★★★★ ()
Ответ на: комментарий от mv

а можно пару слов как значение 1 будет мешать в моем случае ...

drZlo ()
Ответ на: комментарий от drZlo

src/dst ip/mac в мультикастном пакете не этого хоста => rp_filter считает пакет левым (не имеющим отношения к хосту) => режет

mv ★★★★★ ()

Странно что тебя не послали Стивенса читать, там все это есть.

Boy_from_Jungle ★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

А я воспользуюсь советом. Спасибо, хорошая книга.

obinos ()
Ответ на: комментарий от mv

sysctl -a | grep rp_filter

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.eth1.arp_filter = 0
net.ipv4.conf.eth2.rp_filter = 1
net.ipv4.conf.eth2.arp_filter = 0
net.ipv4.conf.eth3.rp_filter = 1
net.ipv4.conf.eth3.arp_filter = 0

drZlo ()
Последнее исправление: drZlo (всего исправлений: 1)
Ответ на: комментарий от mv

На стороне приемника не знаю. У меня на передатчике - нет.

drZlo ()
Ответ на: комментарий от drZlo

На стороне приемника не знаю. У меня на передатчике - нет.

Если делает, то будет приходить. Если не делает, свичи между клиентом и сервером тупые, rp_filter=0, то тоже будет приходить. Если не делает, свичи умные, на rp_filter уже пофиг, то приходить не будет. Если не делает, свичи тупые, rp_filter=1, то приходить будет, но будет выкинут rp_filter'ом.

mv ★★★★★ ()
Последнее исправление: mv (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.