首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改套接字的IP_MULTICAST_IF

如何更改套接字的IP_MULTICAST_IF
EN

Stack Overflow用户
提问于 2012-07-30 15:26:52
回答 2查看 10.8K关注 0票数 3

我有一台电脑,有5个接口:3个带公网I,2个本地I。我正在尝试向UDP服务器发送"HELLO“,但我想将接口更改为本地IP地址之一。我做了一些研究,这是我需要在python中添加的代码行:

代码语言:javascript
复制
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton("64.195.10.11"))

其中64.195.10.11是我想要更改的IP

所以我的python代码看起来像这样:

代码语言:javascript
复制
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,它就不起作用(数据包不会被传送)。我不确定是脚本没有发送,还是服务器没有接收。这是怎么回事?

服务级别

编辑:我正在用两种方式收听:

代码语言:javascript
复制
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)

并使用twisted:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-31 03:46:12

答案是:我防火墙不接受来自RFC1918 IP地址的udp数据包。

票数 1
EN

Stack Overflow用户

发布于 2012-07-30 22:25:03

如果服务器和客户端在同一台机器上(为了测试),您可能需要像这样设置IP_MULTICAST_LOOP选项(c代码):

代码语言:javascript
复制
int loop_on = 1;
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop_on, sizeof(loop_on));

在python中,您可以尝试如下所示:

代码语言:javascript
复制
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)

希望这能有所帮助。

编辑:添加一些跟踪(来自我的Linux机器)

我使用的代码与SquallLeohart发布的代码相同:

代码语言:javascript
复制
#! /usr/bin/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("192.168.1.7"))
sock.sendto("HELLO", (MCAST_GRP, MCAST_PORT))

和:

代码语言:javascript
复制
#! /usr/bin/python
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("192.168.1.7"))
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)

我得到了以下输出:

代码语言:javascript
复制
waiting to receive message
received 5 bytes from ('192.168.1.7', 43761)
HELLO
sending acknowledgement to ('192.168.1.7', 43761)

waiting to receive message
received 5 bytes from ('192.168.1.7', 52326)
HELLO
sending acknowledgement to ('192.168.1.7', 52326)

waiting to receive message

使用tcpdump:

代码语言:javascript
复制
21:01:33.814728 IP localhost.localdomain.34956 > all-systems.mcast.net.10222: UDP, length 5
21:01:35.364605 IP localhost.localdomain.39078 > all-systems.mcast.net.10222: UDP, length 5
21:01:36.228477 IP localhost.localdomain.49926 > all-systems.mcast.net.10222: UDP, length 5

致以问候。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11717039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档