Как настроить сокет для многоадресной передачи UDP с 2 существующими сетевыми платами?

Поскольку ваше выбранное состояние само по себе является наблюдаемым, вы можете объединить его в свой поток с оператором withLatestFrom.

Это грубый пример, но я думаю, что вы ищете что-то вроде:

@Effect()
loadEstateOwners$ = this.actions$.pipe(
  ofType(EstateOwnerListActionTypes.LoadEstateOwners),
  withLatestFrom(this.store.select('userProfile')),
  map(([actions, user]) => {
    // Do something ...
  })
);

Подробнее о withLatestFrom в документации по rxjs здесь: https: // www.learnrxjs.io/operators/combination/withlatestfrom.html

12
задан Carlos 11 January 2018 в 19:03
поделиться

2 ответа

Я думаю, что необходимо добавить IP_MULTICAST_IF

    struct  ip_mreq         multi;

   multi.imr_multiaddr.s_addr = inet_addr(group.c_str());
   multi.imr_interface.s_addr = (source_iface.empty() ?
         htonl(INADDR_ANY): inet_addr(source_iface.c_str()));

    status = setsockopt(me->ns_fd, IPPROTO_IP, IP_MULTICAST_IF,
        (char *)&multi.imr_interface.s_addr,
        sizeof(multi.imr_interface.s_addr));

Я надеюсь, что это помогает.

3
ответ дан 2 December 2019 в 21:45
поделиться

После некоторого поиска и тестирования я нашел здесь, что при привязке udp многоадресно передавал сокет, мы указываем, что порт и отпуск обращаются пустой, например, указывают INADDR_ANY.

Так следующее

addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = (source_iface.empty() ?
                        htonl(INADDR_ANY) : 
                        inet_addr(source_iface.c_str()));

должен быть будьте похожи:

КОММЕНТАРИЙ: Если я понимаю Ваш код, необходимо связывать с групповым адресом не подстановочный адрес. Если Вы свяжете с подстановочным адресом, то Вы сможете получить одноадресные пакеты на своем порте многоадресной передачи. Привязка к Вашему групповому адресу предотвратит это и гарантирует, чтобы Вы только получили многоадресные пакеты на том порте.

Править: Зафиксированный код на основе вышеупомянутого комментария, обязывая с групповым адресом, сохраненным в 'группе', в противоположность INADDR_ANY получать только многоадресные пакеты, отправленные в групповой адрес.

addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = (group.empty() ?
                        htonl(INADDR_ANY) :
                        inet_addr(group.c_str()));

Это решило проблему. Добавление IP_MULTICAST_IF не поможет, потому что это - для выбора определенного интерфейса для отправки udp данные, проблема выше была на получении стороны.

9
ответ дан 2 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: