我有一台计算机有5个接口:3与公共IP和2本地IP。我试图将“HELLO”发送到UDP服务器,但我想将接口更改为本地IP地址之一。我做了一些研究,这是我需要在Python添加一行:如何更改套接字的IP_MULTICAST_IF
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,它将不起作用(数据包未送达)。我不确定脚本是否没有发送,或者服务器没有收到。发生什么事?
SL
编辑:
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'成功或失败了吗? – 2012-07-30 07:41:28
@SquallLeohart:你想测试的服务器和本地地址(私有地址)在同一台机器上? – TOC 2012-07-30 08:38:33
当我使用[RFC 1918](http://tools.ietf.org/html/rfc1918)地址时,我对这段代码没有任何问题; wireshark显示组播数据包无问题 – 2012-07-30 11:55:46