windows7 python 指定源组播 10049_Python-Windows上的多播绑定上的绑定错误

我需要在Python应用程序中使用多播,在谷歌搜索了一下之后,我发现了有效的代码片段,这里是:

# UDP multicast examples, Hugo Vincent, 2005-05-14.

import socket

import sys

import struct

def send(data, port=50000, addr='239.192.1.100'):

"""send(data[, port[, addr]]) - multicasts a UDP datagram."""

# Create the socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Make the socket multicast-aware, and set TTL.

s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20) # Change TTL (=20) to suit

s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)

# Send the data

s.sendto(data, (addr, port))

def recv(port=50000, addr="239.192.1.100", buf_size=1024):

"""recv([port[, addr[,buf_size]]]) - waits for a datagram and returns the data."""

# Create the socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Set some options to make it multicast-friendly

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

try:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

except AttributeError:

pass # Some systems don't support SO_REUSEPORT

s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20)

# Bind to the port

s.bind(('', port))

# Set some more multicast options

intf = socket.gethostbyname(socket.gethostname())

s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf))

mreq = struct.pack("4sl", socket.inet_aton(addr), socket.INADDR_ANY)

s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

# Receive the data, then unregister multicast receive membership, then close the port

data, sender_addr = s.recvfrom(buf_size)

s.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(addr) + socket.inet_aton('0.0.0.0'))

s.close()

return data

if __name__=="__main__":

if sys.argv[1] == "recv":

print recv()

else:

send("a")

我对绑定和多播有问题.

据我了解,如果我绑定接收消息的套接字,在这种情况下,它将过滤通信. (”,port)表示我想接收来自此套接字和此端口的所有流量,而不管数据包的目标ip(与0.0.0.0相同),让我们将这种情况称为1.

如果我有bind((addr,port)),这也有效.我将收到所有目的IP为该多播组的数据包(当然,我也需要加入该多播组),这是情况2.

现在,正如我所说的,这两种方法都有效,但仅适用于Linux.

我在Windows机器上尝试了我的小程序,第一种情况有效,但是当我尝试另一种时,我得到了

Traceback (most recent call last):

File "test.py", line 51, in

print recv()

File "test.py", line 32, in recv

s.bind((addr, port))

File "C:\Python27\lib\socket.py", line 224, in meth

return getattr(self._sock,name)(*args)

socket.error: [Errno 10049] The requested address is not valid in its context

我不是Windows系统专家(我主要在Linux上进行开发),但是我很感兴趣,为什么我的代码仅在Windows系统(我使用Windows 7 btw)上失败并出现此错误.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值