- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一台有 5 个接口(interface)的计算机:3 个具有公共(public) IP 接口(interface),2 个具有本地 IP 接口(interface)。我正在尝试向 UDP 服务器发送“HELLO”,但我想将接口(interface)更改为本地 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 个公共(public) 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()
最佳答案
如果服务器和客户端位于同一台计算机上(用于测试),也许您需要设置 IP_MULTICAST_LOOP
选项,如下所示(c 代码):
int loop_on = 1;
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop_on, sizeof(loop_on));
在 python 中你可以尝试这样的事情:
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
希望这有帮助。
编辑:添加一些跟踪(来 self 的 Linux 盒子)
我使用的代码与 SquallLeohart 发布的代码相同:
#! /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))
还有:
#! /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)
我得到了这个输出:
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:
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
问候。
关于sockets - 如何更改套接字的 IP_MULTICAST_IF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717039/
我有一台有 5 个接口(interface)的计算机:3 个具有公共(public) IP 接口(interface),2 个具有本地 IP 接口(interface)。我正在尝试向 UDP 服务器发
我试图弄清楚,在设置新套接字后,IP_MULTICAST_IF 选项使用什么默认值。不幸的是我的代码出现了段错误,我实际上不知道为什么?!我做错了什么吗?或者如何获取 IP_MULTICAST_IF
例如,我的机器是多宿主的并且有两个网络接口(interface): 无线网卡 WiFi : Ip: 10.20.19.140 以太网适配器以太网:Ip:10.20.19.154 我创建了两个 UDP
我需要通过我机器上所有具有多播功能的接口(interface)来多播一个数据包。通过使用 setsockopt() 设置 IP_MULTICAST_IF,我可以选择通过哪个接口(interface)多
我正在尝试使用 Java 查找名为 test 的 SLP 服务,该服务正在我的网络上运行并创建到它的连接。我知道该服务正在运行,可以使用命令“slptool findsrvs service:test
我正在编写一个发送和接收多播数据包的小程序。我需要使用其名称(例如 eth0)而不是其地址来设置传出接口(interface)。因此,我必须使用 struct ip_mreqn (而不是 struct
我是一名优秀的程序员,十分优秀!