python socket发送组播数据_如何在Python中使用UDP多播?

本文介绍了如何在Python中使用socket进行UDP多播,包括创建接收器和发送器。通过设置socket选项,如`IP_ADD_MEMBERSHIP`和`IP_MULTICAST_TTL`,实现了多播数据的发送和接收。示例代码展示了如何指定接口、多播组和端口来收发多播数据。
摘要由CSDN通过智能技术生成

只是另一个解释其他答案代码中一些微妙点的答案:

socket.INADDR_ANY

-(编辑)在

IP_ADD_MEMBERSHIP

,这并不真正将套接字绑定到所有接口,而只是选择启动多播的默认接口(根据路由表)

多播接收器:

import socket

import struct

import argparse

def run(groups, port, iface=None, bind_group=None):

# generally speaking you want to bind to one of the groups you joined in

# this script,

# but it is also possible to bind to group which is added by some other

# programs (like another python program instance of this)

# assert bind_group in groups + [None], \

# 'bind group not in groups to join'

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

# allow reuse of socket (to allow another instance of python running this

# script binding to the same ip/port)

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

sock.bind(('' if bind_group is None else bind_group, port))

for group in groups:

mreq = struct.pack(

'4sl' if iface is None else '4s4s',

socket.inet_aton(group),

socket.INADDR_ANY if iface is None else socket.inet_aton(iface))

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

while True:

print(sock.recv(10240))

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument('--port', type=int, default=19900)

parser.add_argument('--join-mcast-groups', default=[], nargs='*',

help='multicast groups (ip addrs) to listen to join')

parser.add_argument(

'--iface', default=None,

help='local interface to use for listening to multicast data; '

'if unspecified, any interface would be chosen')

parser.add_argument(

'--bind-group', default=None,

help='multicast groups (ip addrs) to bind to for the udp socket; '

'should be one of the multicast groups joined globally '

'(not necessarily joined in this python program) '

'in the interface specified by --iface. '

'If unspecified, bind to 0.0.0.0 '

'(all addresses (all multicast addresses) of that interface)')

args = parser.parse_args()

run(args.join_mcast_groups, args.port, args.iface, args.bind_group)

python3 multicast_recv.py --iface='192.168.56.102' --join-mcast-groups '224.1.1.1' '224.1.1.2' '224.1.1.3' --bind-group '224.1.1.2'

python3 multicast_recv.py --iface='192.168.56.102' --join-mcast-groups '224.1.1.4'

多播发送程序:

import socket

import argparse

def run(group, port):

MULTICAST_TTL = 20

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL)

sock.sendto(b'from multicast_send.py: ' +

f'group: {group}, port: {port}'.encode(), (group, port))

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument('--mcast-group', default='224.1.1.1')

parser.add_argument('--port', default=19900)

args = parser.parse_args()

run(args.mcast_group, args.port)

示例用法:#假设接收器绑定到下面的多播组地址,并且某些程序请求加入该组。为了简化这种情况,假设接收者和发送者在同一个子网下

python3 multicast_send.py --mcast-group '224.1.1.2'

python3 multicast_send.py --mcast-group '224.1.1.4'

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值