标签: multicast

加入同一多播地址上的源特定多播

我正在尝试使用源特定多播 (SSM) 为 Linux 上的应用程序设置多播源,代码运行正常(使用 C 接口),但我想验证系统是否会按照我的预期运行。

设置:
多播地址 - 233.XXX:9876
源 1 - 192.XX1
源 2 - 192.XX2
接口 1 - 192.XX100
接口 1 - 192.XX101

脚步

  1. 配置为仅 Source1 发送到多播地址
  2. 启动绑定到多播地址的读取器 (reader1) 并加入多播,其中 ssm src 作为 Source1,接口作为 Interface1
  3. 观察在 reader1 上看到数据
  4. 执行相同的操作 (reader2),但使用 Source2 和 Interface2

期望的结果:
Reader1 可以看到来自多播的数据。
Reader2 看不到来自多播的数据。

我担心上述情况不会出现,因为在我使用非源特定多播的测试中,IP_ADD_MEMBERSHIP 具有全局效果。因此 reader2 的套接字可以看到数据,因为它绑定到已加入到查看数据的接口的唯一多播地址。“加入多播”下的此链接中的信息与我的观察相符。

IP_ADD_SOURCE_MEMBERSHIP 的行为很可能与 IP_ADD_MEMBERSHIP 不同,但文档很少且在这方面不具体。

具体问题:

  1. 是使用 IP_ADD_SOURCE_MEMBERSHIP 全局的多播加入,即会导致任何套接字绑定()到多播地址以接收来自该源的数据包。
  2. SSM 一般应该如何使用?拥有一个具有 N 个源的多播地址有意义吗?

我对网络编程缺乏经验,所以请原谅我理解上的任何缺陷。

感谢您的任何帮助。

c sockets linux networking multicast

4
推荐指数
1
解决办法
2430
查看次数

在Linux上进行多播时选择接口

我正在使用运行Debian 4的大约40个节点的集群.每个节点都运行一个守护程序,该守护程序位于并侦听多播IP.

我写了一些客户端软件,通过局域网发送多播,客户端计算机与集群在同一台交换机上,这样集群中的每个节点都会收到数据包并做出响应.

它运行良好,除非我在具有LAN和WAN接口的计算机上运行客户端软件.如果存在WAN接口,则多播不起作用.显然,我认为组播错误地通过WAN接口(eth0),而不是LAN(eth1.)所以,我使用SO_BINDTODEVICE套接字选项强制组播套接字使用eth1,一切都很好.

但我认为内核的路由表应该确定LAN(eth1)显然是组播的低成本目的地.有什么理由我必须明确强制套接字使用eth1吗?并且,是否有某种方式(可能是ioctl调用)我可以让应用程序自动确定特定接口是LAN还是WAN?

multicast

3
推荐指数
1
解决办法
6124
查看次数

IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP和IP_ADD_SOURCE_MEMBERSHIP/IP_DROP_SOURCE_MEMBERSHIP有什么区别?

处理发送多播数据包的项目,接收者可以根据需要选择加入/退出组.我注意到有两种加入/离开组的方法:IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP和IP_ADD_SOURCE_MEMBERSHIP/IP_DROP_SOURCE_MEMBERSHIP.无法从这里的手册页中得到任何东西,所以把这个扔给SO大师.有什么区别,如果有的话,你能举例说明何时使用一个而不是另一个?

c sockets multicast network-protocols

3
推荐指数
1
解决办法
2857
查看次数

检测UDP组播接收失败

我有一个UDP服务器绑定到一个众所周知的端口,将自己添加到一个多播组并侦听客户端的请求.(服务器位于Windows上,并使用WSARecvFrom为客户端数据报发出重叠接收.)客户端以其众所周知的端口和多播IP地址向服务器发送消息.

在笔记本电脑上测试"服务器"时,我注意到如果笔记本电脑进入"睡眠"状态,服务器的接收套接字将从多播地址变为"未绑定"(以便不再接收客户端发送到多播地址) .但是,套接字仍在接收,仍然接收到127.0.0.1的端口发送 - 并且Windows不指示任何错误.(服务器套接字绑定到INADDR_ANY.)

"服务器"是用于自动发现的对等应用程序的一部分 - 因此这种情况并不像预期的那样不寻常.

您能否建议一种方法来确定服务器是否仍在主动侦听多播地址而不发送到多播地址(这会导致网络上所有"服务器"的不必要流量)?一种可能的解决方案是发送到用于多播的适配器的IP地址,但我不知道如何确定.

sockets windows multicast

3
推荐指数
1
解决办法
1789
查看次数

REGEX用于组播IP地址

我在stackoverflow上经历了这篇精彩的帖子

验证IP地址不是0.0.0.0或多播地址

但这是一个自定义的javascript函数,我必须在我的aspx页面中编写,而不是这有任何正则表达式等效,这可能有助于验证多播IP地址

例如,224.0.0.1和239.255.255.255之间的多播IP地址

在此先感谢您的努力.:)

regex asp.net multicast ip-address

3
推荐指数
1
解决办法
2249
查看次数

Python-Windows上的多播绑定上的绑定错误

我需要在Python应用程序中使用多播,在谷歌搜索了一下之后,我发现了可以工作的代码片段,这里是:

# UDP multicast examples, Hugo Vincent, 2005-05-14.
import socket
import sys
import struct

def send(data, port=50000, addr='239.192.1.100'):
    """send(data[, port[, addr]]) - multicasts a UDP datagram."""
    # Create the socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # Make the socket multicast-aware, and set TTL.
    s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20) # Change TTL (=20) to suit
    s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
    # Send the data
    s.sendto(data, (addr, port))

def recv(port=50000, addr="239.192.1.100", buf_size=1024):
    """recv([port[, addr[,buf_size]]]) - waits for a datagram and returns the data."""

    # Create the socket …
Run Code Online (Sandbox Code Playgroud)

python networking udp multicast

3
推荐指数
1
解决办法
4112
查看次数

通过C中的Netlink从内核到用户空间的多播

我试图编写一个使用Netlink在内核和用户空间之间进行通信的简单程序.基本上这就是我想要实现的目标:

  1. 用户空间程序开始绑定到用户定义的多播组.
  2. 插入内核模块
  3. 内核模块向此多播组发送消息
  4. 用户空间程序接收消息

这是我的代码:

======用户空间程序======

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<linux/netlink.h>
#include<sys/types.h>
#include<unistd.h>

#define MYPROTO NETLINK_USERSOCK
#define MYMGRP 0x21 //User defined group, consistent in both kernel prog and user prog

int open_netlink()
{
        int sock = socket(AF_NETLINK,SOCK_RAW,MYPROTO);
        struct sockaddr_nl addr;

        memset((void *)&addr, 0, sizeof(addr));

        if (sock<0)
                return sock;
        addr.nl_family = AF_NETLINK;
        addr.nl_pid = getpid();
        addr.nl_groups = MYMGRP;
        if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
                return -1;
        return sock;
}

int read_event(int sock)
{
        struct sockaddr_nl nladdr;
        struct msghdr msg;
        struct iovec iov[2]; …
Run Code Online (Sandbox Code Playgroud)

c kernel multicast linux-kernel netlink

3
推荐指数
1
解决办法
8070
查看次数

angular2类型'主题<{}>'不能分配给'()=>主题<number>'

我使用angular2 rxjs来测试它的多播功能,这是我的代码:

var source = Observable.from([1, 2, 3]);
var subject = new Subject();
var multicasted = source.multicast(subject);

// These are, under the hood, `subject.subscribe({...})`:
multicasted.subscribe({
    next: (v) => console.log('observerA: ' + v)
});
multicasted.subscribe({
    next: (v) => console.log('observerB: ' + v)
});

// This is, under the hood, `source.subscribe(subject)`:
multicasted.connect();
Run Code Online (Sandbox Code Playgroud)

我收到了错误信息:

"Subject <{}>"类型的参数不能分配给类型的参数

'Subject<number> | (() => Subject<number>)'.
        Type 'Subject<{}>' is not assignable to type '() => Subject<number>'.
        Type 'Subject<{}>' provides no match for the signature '(): Subject<number>'
Run Code Online (Sandbox Code Playgroud)

multicast rxjs typescript angular

3
推荐指数
1
解决办法
2872
查看次数

如果我在关闭套接字之前不发送 IP_DROP_MEMBERSHIP 会发生什么?

我正在编写一些使用 IGMP 加入多播组的代码

struct ip_mreq mreq;
inet_pton(AF_INET, group, &mreq.imr_multiaddr.s_addr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0)
    throw std::runtime_error(perror("setsockopt(IP_ADD_MEMBERSHIP)"));
Run Code Online (Sandbox Code Playgroud)

当应用程序关闭时,它关闭套接字

close(fd);
Run Code Online (Sandbox Code Playgroud)

但是,它不执行IP_DROP_MEMBERSHIP.

  • 上游路由器会继续将多播传送到我的网络接口吗?
  • 操作系统(在我的情况下是 Linux)是否足够智能,可以在套接字关闭时为我发送删除成员资格请求?

c++ sockets multicast igmp

3
推荐指数
1
解决办法
1464
查看次数

使用相同的套接字发送和接收 UDP 多播数据包

我找不到一个工作示例,所以我将发布一个问题(让我们看看是否可以将其简化为 MVP 代码示例)。所以,我需要做 mdns 查询,我可以使用两个套接字(一个用于发送/第二个用于接收),但到目前为止我还无法使其与单个套接字一起工作。

所以我正在执行的步骤是:

枚举主机上的所有接口地址。然后对于每个主机:

  1. 创建非阻塞 UDP 套接字
  2. bind() 到接口地址:5353 或多播组地址(这些都会导致读取或写入失败)
  3. 将 IP_MULTICAST_IF 设置为本地接口
  4. IP_ADD_MEMBERSHIP 到多播组
  5. 在 kqueue 中添加用于读/写的套接字

因此,根据我在第 2 步中执行的操作,读取或写入失败:

  1. 如果我将套接字绑定到多播组,我会从 kqueue 收到读取通知并可以读取数据包,但是当我从 kqueue 收到写入通知并尝试写入时,它会失败并显示 errno 49
  2. 如果我将套接字绑定到接口地址,我可以发送数据包,但没有读取通知从 kqueue 到达

那么我需要绑定到哪个地址呢?另外,由于IP_ADD_MEMBERSHIP参数ip_mreq有接口字段,我真的需要IP_MULTICAST_IF吗?

c sockets posix multicast multicastsocket

3
推荐指数
1
解决办法
806
查看次数