2020年6月7日 / 187次阅读 / Last Modified 2020年6月12日
socket
UDP这种报文的性质,很适合用来做服务器的心跳,DNS服务器也是基于UDP的。它不建立连接,不重传,错了没有太大关键。在局域网中,UDP很适合用来发现服务器,比如广播UDP报文,服务器收到后回应自己的TCP连接信息。
# 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)
我在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条留言
前一篇:tcp接口的基本用法
后一篇:线程和主GUI同时访问log窗口造成的死锁问题
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记
Linux和Win系统下,发送UDP广播的方式不太一样! [ ]