【发布时间】:2012-07-27 20:35:07
【问题描述】:
我有一台具有 5 个接口的计算机:3 个具有公共 IP 和 2 个本地 IP。我正在尝试向 UDP 服务器发送“HELLO”,但我想将接口更改为本地 IP 地址之一。我做了一些研究,这是我需要在 python 中添加的行:
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton("64.195.10.11"))
64.195.10.11 是我要更改的 IP
所以我的python代码是这样的:
import socket
MCAST_GRP = '224.0.0.1'
MCAST_PORT = 10222
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton("64.195.10.10"))
sock.sendto("HELLO", (MCAST_GRP, MCAST_PORT))
当我在我的 3 个公共 IP 地址之间进行更改时,它可以完美运行。但是,如果我在参数中输入本地 IP,它就不起作用(数据包未传递)。我不确定是脚本没有发送,还是服务器没有接收。发生了什么?
止损
编辑:我正在使用两种方式收听:
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", 10222))
sock.setsockopt(socket.IPPROTO_IP,
socket.IP_ADD_MEMBERSHIP,
socket.inet_aton("224.0.0.1") +
socket.inet_aton("64.195.10.11"))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0)
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
print >>sys.stderr, 'sending acknowledgement to', address
sock.sendto('ack', address)
并使用扭曲:
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
from twisted.application.internet import MulticastServer
class MulticastServerUDP(DatagramProtocol):
def __init__ (self, group, name):
self.group = group
self.name = name
def startProtocol(self):
print '%s Started Listening' % self.group
self.transport.joinGroup(self.group)
def datagramReceived(self, datagram, address):
print "%s Received:"%self.name + repr(datagram) + repr(address)
reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER1'), listenMultiple = True)
reactor.run()
【问题讨论】:
-
“它不起作用”不是一个很有帮助的问题描述。
setsockopt是成功还是失败?sendto是成功还是失败? -
@SquallLeohart : 你要测试的服务器和本地地址(私有地址)在同一台机器上?
-
当我使用RFC 1918 地址时,这段代码完全没有问题; wireshark 显示多播数据包没有问题
-
所以让我们明确一点,您想将多播从 64.194.10.11 的单播地址发送到 RFC 1918 地址吗?如果不是,请明确指出发送方和接收方的单播地址,因为您的问题很可能比 Python 更基本
-
如果您的发送方和接收方之间有防火墙,那么您很可能遇到了防火墙问题......它们往往会导致多播配置出现问题
标签: sockets interface ip multicast