功能說明:
廣播使用廣播位址255.255.255.255,将消息發送到區域網路中的每個主機,主機可以對收到的廣播進行處理或不響應。應用場景:若區域網路中有100多台裝置,每台裝置的型号不一緻,若快速區分,可收到廣播後回複目前型号,用于管理裝置
代碼:
import socket
import time
import json
import psutil
# 發送廣播
def main(win_ip,win_port,dev_ip,dev_port,message):
# 設定目标位址
dest = (dev_ip,dev_port)
# 建立廣播發送器
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 設定允許廣播,位址為接收資料位址
s.bind((win_ip,win_port))
# 設定套接字可以發送接收廣播
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
#s.setblocking(10)#設定阻塞
print ("擷取電腦端的端口号資訊:")
# 'all', 'tcp', 'tcp4', 'udp', 'udp4', 'inet', 'inet4', 'inet6', 'tcp6', 'udp6'
for session in psutil.net_connections(kind="udp"):
if session.laddr.port == win_port:
print (session)
# 發送廣播
print ("發送廣播:\n%s"%message)
s.sendto(message.encode('utf-8'),dest)
s.settimeout(2) # 設定等待逾時時間為5s
while True:
try:
msg, addr = s.recvfrom(1024)
if msg:
print('接收回複:\n服務端位址:%s\n響應内容:%s'%(addr, msg.decode('utf-8')))
time.sleep(0.2)
except Exception as e:
#time.sleep(200)
break
s.close()
if __name__=="__main__":
win_ip = '192.168.x.x'
win_port = 6000
dev_ip = '255.255.255.255' # 單個裝置:192.168.x.x,多台裝置255.255.255.255
dev_port = 37020
message = '{"devtype":[1111]}'
main(win_ip,win_port,dev_ip,dev_port,message)
執行:
測試結果: