如何发局域网广播UDP?

2020年6月7日 / 9次阅读 / Last Modified 2020年6月12日
socket

UDP这种报文的性质,很适合用来做服务器的心跳,DNS服务器也是基于UDP的。它不建立连接,不重传,错了没有太大关键。在局域网中,UDP很适合用来发现服务器,比如广播UDP报文,服务器收到后回应自己的TCP连接信息。

Linux下发UDP广播

# Send UDP broadcast packets

MYPORT = 50000

import sys, time
from socket import *

s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 0))
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

while 1:
    data = repr(time.time()) + '\n'
    s.sendto(data, ('', MYPORT))
    time.sleep(2)

使用局域网广播ip地址(Win系统)

我在Win10系统上测试用python发送UDP广播报文,只有下面这种方法是成功的。比如你的局域网的ip地址段为192.168.1.0/24,使用192.168.1.255这个局域网广播地址发送UDP报文。不能使用255.255.255.255,也不能使用python给的broadcast选项。

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto((msg).encode(), ('192.168.1.255', 2020))
rdata, raddr = s.recvfrom(256)
print(rdata.decode().split(), raddr)

特别注意局域网广播ip地址。

如果使用255.255.255.255,会有如下权限提示:

D:\py>python udp_client.py
Traceback (most recent call last):
  File "udp_client.py", line 16, in 
    s.sendto((msg).encode(), ('255.255.255.255', 2020))
OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

也可以使用单播轮训的方式!

系统防火墙,中间的交换机路由器等,都有可能对广播报文造成影响。单播轮训的方式,可能更好的保证报文正常返送,但是接收是个问题!我暂时还没有解决这个问题,应该是要用到selector这种IO multiplexing技术,异步socket通信。

-- EOF --

本文链接:https://www.pynote.net/archives/2059

留言区

《如何发局域网广播UDP?》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    Linux和Win系统下,发送UDP广播的方式不太一样! [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top