问题描述
我是Python套接字的新手,并且通常具有多播功能。 我在这里和其他地方看到过不同的代码来进行多播,而我正在使用一种代码 客户端代码目前在Windows 10上运行-将来应该可以在Windows,Linux和macOS上运行。
该服务器目前将在linux -Ubuntu 16.04上运行,但将来也应在ubuntu 20.04上运行-
当我在计算机上运行两个代码(Windows 10)时,通讯正常。 在两台单独的计算机或设备上工作时,只有在它们之间有路由器的情况下才能工作。
即使两台设备之间在两个方向上都存在PING,也无法使用固定电缆和静态IP连接它们。 -服务器可以ping通客户端,客户端可以ping通服务器-
用电缆将两个设备连接在一起而没有路由器时,如何查看UDP多播数据包?
当前我正在使用以下代码进行测试:
- 客户代码
import socket
import sys
message = b'very important data'
multicast_group = ('224.1.1.1',10000)
# Create the datagram socket
sock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
# Set a timeout so the socket does not block indefinitely when trying
# to receive data.
sock.settimeout(5)
ttl = 1
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,ttl)
try:
# Send data to the multicast group
print(sys.stderr,'sending "%s"' % message)
sent = sock.sendto(message,multicast_group)
# Look for responses from all recipients
while True:
print(sys.stderr,'waiting to receive')
try:
data,server = sock.recvfrom(16)
except socket.timeout:
print(sys.stderr,'timed out,no more responses')
break
else:
print(sys.stderr,'received "%s" from %s' % (data.decode("utf-8"),server))
finally:
print(sys.stderr,'closing socket')
sock.close()
- 服务器代码:
import socket
import struct
import sys
multicast_group = '224.1.1.1'
server_address = ('',10000)
# 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 add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL',group,socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,mreq)
# Receive/respond loop
while True:
print(sys.stderr,'\nwaiting to receive message')
data,address = sock.recvfrom(1024)
print(sys.stderr,'received %s bytes from %s' % (len(data),address))
print(sys.stderr,data.decode("utf-8"))
print(sys.stderr,'sending ackNowledgement to',address)
sock.sendto(b'ack',address)
非常感谢您的帮助。 最好的问候,
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)