[英]python multicast with windows 2012 server receiver fail
在Windows 2012服務器上運行的Python多播接收器未獲得udp流量。 我檢查了流量,發現udp流量到來了。 對於允許邊緣遍歷的多播組,我有一個防火牆udp規則。 我沒有防火牆阻止事件。 相同的代碼適用於Windows 2008 Server客戶端。
在服務器(Linux ubuntu)上:
PORT = 12345
import sys, os, time, socket, struct
from socket import gethostname
mc_ttl = 1
mc_group = '224.7.7.7'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(0.2)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL,
struct.pack('b', mc_ttl))
d = "my data"
while True:
sock.sendto(d, (mc_group, PORT))
在客戶端(Windows 2012服務器)上:
PORT = 12345
import sys, os, time, socket, struct
from socket import gethostname
mc_group = '224.7.7.7'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', PORT))
mreq = struct.pack("4sl", socket.inet_aton(mc_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print sock.recv(10240)
請注意,以上代碼可在Windows 2008服務器上使用。 經過一些搜索之后,我發現INADDR_ANY綁定到錯誤的地址存在一些問題(以及有關綁定到”的必要建議)。 在Windows客戶端上檢查傳入的udp流量,我看到了多播流量,但是接收者沒有收到。
閱讀這篇文章后,我嘗試了以下方法。 這也沒有用。
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
grp = socket.inet_aton(mc_group)
ip = socket.gethostbyname(socket.gethostname())
iface = socket.inet_aton(ip)
mreq = grp + iface
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
sock.bind((ip, PORT))
有人成功在Windows 2012 Server上實現了接收器嗎?
我在其他帖子上更新了響應,使其更加明確。 使用socket.gethostbyname()仍會獲得默認接口,因此您必須使用socket.gethostbyname_ex()
來獲取擴展列表,然后選擇所需的接口。
看一下區別:
socket.gethostbyname(socket.gethostname())
# "169.254.80.80"
socket.gethostbyname_ex(socket.gethostname())
# ("PCName", [], ["169.254.80.80", "192.168.1.10"])
在上面的示例中,我們希望跳過第一個169.254鏈接本地地址,然后選擇所需的192.168.1.10地址。 如果在上面的示例中使用了socket.gethostbyname()
,它將被選擇為本地鏈接(169.254。*)地址,並且您的代碼不會做很多事情。
socket.gethostbyname_ex(socket.gethostname())[2][1]
# "192.168.1.10"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.