gpt4 book ai didi

Python UDP套接字如果没有收到数据则发送数据

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:58 27 4
gpt4 key购买 nike

我想向传感器发送一些数据,如果 python 脚本没有收到数据,我希望接收函数超时并重新发送数据。

def subscribe():
UDP_IP = "192.168.1.166"
UDP_PORT = 10000
MESSAGE = '6864001e636caccf2393730420202020202004739323cfac202020202020'.decode('hex')
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
recieve_data = recieve()
if recieve_data == subscribe_recieve_on or recieve_data == subscribe_recieve_off:
logging.info('Subscribition to light successful')
else:
logging.info('Subscribition to light unsuccessful')

def recieve():
UDP_IP = "192.168.1.118"
UDP_PORT = 10000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
data, addr = sock.recvfrom(1024)
return data.encode('hex')

subscribe()

目前,如果没有收到任何数据,它就会卡在接收函数中:

data, addr = sock.recvfrom(1024)

但是我希望它在例如之后超时2 秒并重新运行 subscribe() 函数。

我尝试使用带有超时和尝试/异常的 while true 语句,但是即使关闭端口,我也会得到当前正在使用的端口。也觉得这样子很乱。

任何想法将不胜感激。

最佳答案

您会收到“当前正在使用”异常,因为每次调用这些函数中的任何一个时都会重新创建套接字,而不先关闭它们。

尝试预先创建套接字。响应可能会在创建接收套接字之前出现,在这种情况下,数据包将被拒绝。

那么您应该仅尝试循环中的 sendto-recvfrom 调用。

此外,您还需要使用 settimeout 设置超时在接收套接字上,这样它就不会被阻塞,然后捕获超时异常或使用像 select 这样的轮询机制或poll检查您是否收到任何数据。

关于Python UDP套接字如果没有收到数据则发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com