python之UDP广播

概述

向本 局域网 内 所有电脑 发送数据,但不能发到 广域网,也不能 跨网络传输(不会被路由器转发),否则会引起 网络瘫痪。

广播地址与单播不同,是<broadcast>或者255.255.255.255
要指明接收者的 端口号

参见:
http://www.malaoshi.top/show_1EF3BqD8BiSi.html#设置套接字选项和值

代码实现

在若干台电脑上执行下面接收代码(普通接收代码)

#coding=utf-8

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
    udp.bind(('0.0.0.0',8000))
    while True:
        data,addr=udp.recvfrom(1024)
        print('来自%s:%d的消息::%s'%(addr[0],addr[1],data.decode('utf-8')))

在另一台电脑上执行下面 广播 代码
(多网卡可能不好使)

#coding=utf-8

import socket

#广播地址,表示向本局域网所有电脑发送,下面两个地址都可以
#addr='<broadcast>'
addr='255.255.255.255'
port=8000

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
    #下面这行代码允许发送广播数据
    udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    data='所有电脑注意,测试广播'.encode('UTF-8')
    udp.sendto(data,(addr,port))

以广播的形式发送数据到本局域网的所有电脑

多网卡广播

提出问题

如上图,现在笔记本一般都有wifi网卡和以太网卡(有线网卡),

  • 以太网卡 在一个局域网中,
  • wifi网卡 连接各自的 手机热点,所以两台计算机的wifi网卡 不在一个局域网 中

使用上面的代码实现 UDP广播,有可能是用 wifi网卡 进行 广播,而wifi网卡 不在一个局域网 中,所以 对方收不到数据

解决问题思路

  1. 获取所有网卡的ip地址
  2. 绑定第一个网卡的ip地址,进行广播
  3. 绑定第二个网卡的ip地址,进行广播

如果有更多的网卡,绑定第n个网卡的ip地址,进行广播

实现

#coding=utf-8
import socket
#广播地址,表示向本局域网所有电脑发送,下面两个地址都可以
#addr='<broadcast>'
addr='255.255.255.255'
port=8000

def getips():
    '''
    获取本机所有ipv4的ip地址
    '''
    ips=[]
    hostname = socket.gethostname()
    addrs = socket.getaddrinfo(hostname,None,family=socket.AF_INET)
    for item in addrs:
        ips.append(item[4][0])
    return ips

def broadcast(ip,port):
    '''
    广播
    '''
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
        udp.bind((ip,port))
        #下面这行代码允许发送广播数据
        udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        data='所有电脑注意,测试广播'.encode('UTF-8')
        # data=b'abc'
        udp.sendto(data,(addr,port))

ips=getips()
for item in ips:
    broadcast(item,port)

原文出处:/show_1EF300DpvH5M.html