【发布时间】:2020-12-15 07:01:55
【问题描述】:
我正在尝试从容器 1 发送 UDP 多播消息并尝试在容器 2 上接收它。我已使用 --link 选项将容器 2 与容器 1 链接起来。我正在使用这些示例代码进行测试
multicastsend.py
import socket
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
regarding socket.IP_MULTICAST_TTL
# ---------------------------------
# for all packets sent, after two hops on the network the packet will not
# be re-sent/broadcast (see https://www.tldp.org/HOWTO/Multicast-HOWTO-6.html)
MULTICAST_TTL = 2
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL)
# For Python 3, change next line to 'sock.sendto(b"robot", ...' to avoid the
# "bytes-like object is required" msg (https://stackoverflow.com/a/42612820)
sock.sendto(b"robot", (MCAST_GRP, MCAST_PORT))
multicastrec.py
import socket
import struct
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
IS_ALL_GROUPS = True
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if IS_ALL_GROUPS:
# on this port, receives ALL multicast groups
sock.bind(('', MCAST_PORT))
else:
# on this port, listen ONLY to MCAST_GRP
sock.bind((MCAST_GRP, MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
# For Python 3, change next line to "print(sock.recv(10240))"
print (sock.recv(10240))
容器 2(接收器)上的端口 5007 使用 -p 5007:5007/udp 选项和 docker run 发布
当我在同一个容器上运行发送者和接收者时,消息被正确发布和接收。但是在两个不同的容器中运行时,消息没有被接收
更新
当使用--network=host 选项运行这些容器时,我们能够建立连接。但是有什么办法可以通过docker的默认桥接网络实现这一点
【问题讨论】:
-
另外,顺便说一下,无需使用 -p 将端口公开给您的主机。由于您将绑定到主机上的该端口,因此这只会使事情不太可能起作用。
标签: python-3.x udp multicast udpclient