簡體   English   中英

Windows 2012 Server接收器的python多播失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM