我正在尝试使用源特定多播 (SSM) 为 Linux 上的应用程序设置多播源,代码运行正常(使用 C 接口),但我想验证系统是否会按照我的预期运行。
设置:
多播地址 - 233.XXX:9876
源 1 - 192.XX1
源 2 - 192.XX2
接口 1 - 192.XX100
接口 1 - 192.XX101
脚步
期望的结果:
Reader1 可以看到来自多播的数据。
Reader2 看不到来自多播的数据。
我担心上述情况不会出现,因为在我使用非源特定多播的测试中,IP_ADD_MEMBERSHIP 具有全局效果。因此 reader2 的套接字可以看到数据,因为它绑定到已加入到查看数据的接口的唯一多播地址。“加入多播”下的此链接中的信息与我的观察相符。
IP_ADD_SOURCE_MEMBERSHIP 的行为很可能与 IP_ADD_MEMBERSHIP 不同,但文档很少且在这方面不具体。
具体问题:
我对网络编程缺乏经验,所以请原谅我理解上的任何缺陷。
感谢您的任何帮助。
我正在使用运行Debian 4的大约40个节点的集群.每个节点都运行一个守护程序,该守护程序位于并侦听多播IP.
我写了一些客户端软件,通过局域网发送多播,客户端计算机与集群在同一台交换机上,这样集群中的每个节点都会收到数据包并做出响应.
它运行良好,除非我在具有LAN和WAN接口的计算机上运行客户端软件.如果存在WAN接口,则多播不起作用.显然,我认为组播错误地通过WAN接口(eth0),而不是LAN(eth1.)所以,我使用SO_BINDTODEVICE套接字选项强制组播套接字使用eth1,一切都很好.
但我认为内核的路由表应该确定LAN(eth1)显然是组播的低成本目的地.有什么理由我必须明确强制套接字使用eth1吗?并且,是否有某种方式(可能是ioctl调用)我可以让应用程序自动确定特定接口是LAN还是WAN?
处理发送多播数据包的项目,接收者可以根据需要选择加入/退出组.我注意到有两种加入/离开组的方法:IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP和IP_ADD_SOURCE_MEMBERSHIP/IP_DROP_SOURCE_MEMBERSHIP.无法从这里的手册页中得到任何东西,所以把这个扔给SO大师.有什么区别,如果有的话,你能举例说明何时使用一个而不是另一个?
我有一个UDP服务器绑定到一个众所周知的端口,将自己添加到一个多播组并侦听客户端的请求.(服务器位于Windows上,并使用WSARecvFrom为客户端数据报发出重叠接收.)客户端以其众所周知的端口和多播IP地址向服务器发送消息.
在笔记本电脑上测试"服务器"时,我注意到如果笔记本电脑进入"睡眠"状态,服务器的接收套接字将从多播地址变为"未绑定"(以便不再接收客户端发送到多播地址) .但是,套接字仍在接收,仍然接收到127.0.0.1的端口发送 - 并且Windows不指示任何错误.(服务器套接字绑定到INADDR_ANY.)
"服务器"是用于自动发现的对等应用程序的一部分 - 因此这种情况并不像预期的那样不寻常.
您能否建议一种方法来确定服务器是否仍在主动侦听多播地址而不发送到多播地址(这会导致网络上所有"服务器"的不必要流量)?一种可能的解决方案是发送到用于多播的适配器的IP地址,但我不知道如何确定.
我在stackoverflow上经历了这篇精彩的帖子
但这是一个自定义的javascript函数,我必须在我的aspx页面中编写,而不是这有任何正则表达式等效,这可能有助于验证多播IP地址
例如,224.0.0.1和239.255.255.255之间的多播IP地址
在此先感谢您的努力.:)
我需要在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) 我试图编写一个使用Netlink在内核和用户空间之间进行通信的简单程序.基本上这就是我想要实现的目标:
这是我的代码:
======用户空间程序======
#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) 我使用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) 我正在编写一些使用 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.
我找不到一个工作示例,所以我将发布一个问题(让我们看看是否可以将其简化为 MVP 代码示例)。所以,我需要做 mdns 查询,我可以使用两个套接字(一个用于发送/第二个用于接收),但到目前为止我还无法使其与单个套接字一起工作。
所以我正在执行的步骤是:
枚举主机上的所有接口地址。然后对于每个主机:
因此,根据我在第 2 步中执行的操作,读取或写入失败:
那么我需要绑定到哪个地址呢?另外,由于IP_ADD_MEMBERSHIP参数ip_mreq有接口字段,我真的需要IP_MULTICAST_IF吗?
multicast ×10
sockets ×5
c ×4
networking ×2
angular ×1
asp.net ×1
c++ ×1
igmp ×1
ip-address ×1
kernel ×1
linux ×1
linux-kernel ×1
netlink ×1
posix ×1
python ×1
regex ×1
rxjs ×1
typescript ×1
udp ×1
windows ×1