我想绑定到 mac os x 计算机上的多播 DNS 组和端口,以构建一些 bonjour 功能的原型。但是,当我尝试绑定到端口时,出现以下错误(顺便说一句,这是从 python 运行的):
socket.error: [Errno 48] Address already in use
Run Code Online (Sandbox Code Playgroud)
看起来 mDNSResponder 绑定到地址:未设置 SO_REUSEADDR 的端口。
是否可以以允许其他代理绑定到地址:端口组合的方式运行 mDNSResponder?
在Mac OS X(Lion,10.7.2,Java版本"1.6.0_29")下处理Java应用程序时,我在尝试发送多播UDP数据报时遇到了一个奇怪的问题.数据包仅在一个NIC上发送,我无法控制哪个.
以下示例代码说明了我要执行的操作:
public class MCast {
public static void main(String[] args) throws IOException {
InetAddress multicastAddr = InetAddress.getByName("224.0.0.1");
int port = 58680;
byte[] data = "test".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, multicastAddr, port);
MulticastSocket socket = new MulticastSocket();
socket.joinGroup(multicastAddr);
socket.setNetworkInterface(NetworkInterface.getByName("en0"));
socket.send(packet);
System.out.println("Packet sent.");
}
}
Run Code Online (Sandbox Code Playgroud)
在执行此代码时,我使用Wireshark检查en0上发出的所有流量.在指定的端口上没有发送数据包.但是,所述数据包确实出现在en1的跟踪上.
当我禁用en1时,数据包在en0上正常运行.
我在这里不知所措.有谁知道发生了什么?
具有双接口的服务器。
其中一个(eht0)用于WAN,为互联网用户提供http/ssh服务。
另一个(eth1)用于接收来自内网的组播数据。
218.108.132.177 为公网网关。
125.210.198.1 是私网网关。
233.49.3.*/24 是多播地址。
10.0.11.*/24为组播数据源。
当路由表如下所示时,ffmpeg 无法从 eth1 读取 udp 数据,ffmpeg 挂起:
rrca@rcasnap02:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
218.108.132.176 * 255.255.255.252 U 0 0 0 eth0
125.210.198.0 * 255.255.255.240 U 0 0 0 eth1
default 218.108.132.177 0.0.0.0 UG 100 0 0 eth0
default 125.210.198.1 0.0.0.0 UG 100 0 0 eth1
Run Code Online (Sandbox Code Playgroud)
或者
rrca@rcasnap02:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
218.108.132.176 * …Run Code Online (Sandbox Code Playgroud) 我已经搜索了如何实现一个简单的 ipv6 多播示例的示例,但是我只找到了使用 ipv4 的示例。
任何人都可以提供一个简单的“helloworld”ipv6 多播示例吗?
这些天我在玩多播,遇到了一些我不明白的奇怪事情。
我创建了一个聊天多播客户端,一切似乎都正常。之后,我阅读了一些 linux 文档并发现通过 ping 224.0.0.1 应该从加入某个多播组的所有节点返回我的回复。我在 xp 和 win7 机器上试过。两者的行为是相同的。我的客户似乎只加入我定义的组 (224.0.19.1)。它不加入 224.0.0.1 组。
来自wireshark:[source ip] 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.19.1 for any source
这是我设置套接字的方式:
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(port));
m_socket.Bind(ipep);
IPAddress ip = IPAddress.Parse(mcastGroup);
m_socket.SetSocketOption(
SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(ip, IPAddress.Any));
Run Code Online (Sandbox Code Playgroud)
然后我检查了netsh:
C:\Users\user1>netsh interface ip show joins
Interface 1: Loopback Pseudo-Interface 1
Scope References Last Address
---------- ---------- ---- ---------------------------------
0 2 Yes 239.255.255.250
Interface 11: LAN
Scope References Last Address
---------- ---------- ---- --------------------------------- …Run Code Online (Sandbox Code Playgroud) 我在相同的数据中心有2个新的Ubuntu Linode,除了不同的节点名称之外,它们具有相同的ES配置.群集名称相同.他们每个人都可以互相卷曲ElasticSearch服务器并且还没有防火墙,但多播不起作用,我无法弄清楚原因.它们都将自己选为主节点,并且没有记录其他节点或集群的任何内容.
是否有任何理由为什么多播不能在这样的环境中工作?
我在下面有两个应用程序。我用javaMulticastSocket来发送和接收DatagramPacket。
发件人
public class Sender {
public static void main(String[] args) throws IOException {
int port = 5000;
String group = "225.4.5.6";
final MulticastSocket s = new MulticastSocket();
byte[] buf = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}
final DatagramPacket pack = new DatagramPacket(buf, buf.length,
InetAddress.getByName(group), port);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
s.send(pack);
System.out.println("Sent");
} catch …Run Code Online (Sandbox Code Playgroud) 我希望我的 pod 接收从我的 kubernetes 集群外部流向我节点中特定端口的多播网络流量。
我正在考虑两种解决方案:
hostNetwork: true标志yaml与hostPort配置一起添加到他们的文件中,以便直接接收到 pod 的流量。eth0接口到docker0另一个接口iptables。方法1是Kubernetes的官方特性,但是感觉就像打破了docker最初强加的安全墙,可能会导致与主机进程的端口冲突等。
另一方面,方法 2 将多播网络流量透明地转发到 pod。
尽管我可以使用自动化工具来传播此配置(ansible/salt 等),但任何配置“超出 Kubernetes 范围”的东西对我来说都感觉有点棘手。
想听听您的优点和缺点、评论,以及多播到 kubernetes 集群的问题的其他解决方案。
我有一台 Windows 机器,我有两个脚本通过 UDP 多播(在同一台机器上)发送和接收消息。我有一个 C 和 Python3 实现。Python3 看起来像这样:
发件人.py
import socket
MCAST_GRP = '239.1.1.1'
MCAST_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
print("Sending")
sock.sendto(bytearray("str()", "utf-8"), (MCAST_GRP, MCAST_PORT))
data, address = sock.recvfrom(1024)
print('received %s bytes from %s' % (len(data), address))
print(data)
Run Code Online (Sandbox Code Playgroud)
接收器.py
import socket
import struct
import sys
multicast_group = '239.1.1.1'
server_address = ('', 1234)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind to the server address
sock.bind(server_address)
# Tell the operating system to …Run Code Online (Sandbox Code Playgroud) 我正在 Ada 中试验 IP 多播,但似乎没有收到发送到多播组的任何流量。不知何故,我似乎无法让应用程序获取传入的数据包。
我可以验证(使用 Wireshark)是否从我的计算机发送了多播加入,并且我还可以验证是否有数据发送到多播组。
我可以验证操作系统是否已通过 netsh 命令注册了多播加入:
netsh interfaces ip show joins
Run Code Online (Sandbox Code Playgroud)
如果我运行我的程序,则列出的组的引用为 1;如果不运行,则引用为 0。
以下过程显示了我的侦听器,我使用Mcast_IP => "239.255.128.128"和调用它Mcast_Port => "8807":
with GNAT.Sockets;
with Ada.Streams;
with Ada.Text_IO;
procedure Receive_Multicast (Mcast_IP : in String;
Mcast_Port : in String)
is
package GS renames GNAT.Sockets;
package AS renames Ada.Streams;
package Tio renames Ada.Text_IO;
use GS;
use type Ada.Streams.Stream_Element_Offset;
Socket : GS.Socket_Type;
Address : GS.Sock_Addr_Type;
Data : AS.Stream_Element_Array (1 .. 2**16);
Offset : AS.Stream_Element_Offset;
Sender : GS.Sock_Addr_Type;
begin …Run Code Online (Sandbox Code Playgroud)