记录一次工作中需要使用udp发送广播出现的问题
在本地写好代码后运行广播完全正常,移植到linux上部署后,报没有权限。
Traceback (most recent call last):
File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
self.run()
File "/usr/lib/python3.9/threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "/home/orangepi/video_server/fastApi_server/main.py", line 30, in __init__
self.udpSocket.sendto(json.dumps(self.data).encode('utf-8'), (self.udp_ip, self.udpPort))
PermissionError: [Errno 13] Permission denied
因为对python的socket用法不算很了解,所以这个问题困扰了将近半天时间,详细看了socket文档后发现,python中设置udp广播是有一个方法的,可以使用此方法启用或禁用udp的广播功能。(在Windows上不设置发现也可以使用广播)
setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
# SOL_SOCKET: 常量,表示要操作的选项属于socket层。
# SO_BROADCAST: 常量,表示要设置的选项是广播选项。
# 1: 这是要设置的值,表示启用广播功能。
完整代码:
from socket import *
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
udpSocket.sendto(data, (ip, port))