gpt4 book ai didi

Python 与 UDP 监听器重叠计时器

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:34 26 4
gpt4 key购买 nike

我正在寻找有关在 UDP 监听器服务的 WHILE 循环中包含计时器的见解。该服务是我需要与之交互的设备自动发现系统的一部分。

需要监听器的进程具有三个要求/职责:

  • 在初始套接字绑定(bind)时广播通知数据包(设备已启动)
  • 收听并回复“搜索”广播
  • 无论是否存在“搜索”广播,每 30 分钟广播一个“仍然存在”的数据包

单独执行这些任务中的每一个都没有问题,并且前两个任务很容易包括在内。我不舒服的是“中断监听器”或修改监听器的 WHILE 循环以发送“事件”数据包。

如果我“等待”该时间间隔,我会暂停其他进程。 Scheduler 对象会做同样的事情,还是允许我们继续?我无法使用多线程,因为我需要在绑定(bind)在线程内的特定端口上接收和发送。

这就是我所拥有的...

import time
import socket
import sys
import shutil
import signal
import string
import re
import os
import socket
import fcntl
import struct

HOST = ''
PORT = 8888
RESPONSE_MSG = 'Yes, I'm here'
ALIVE_MSG = 'I'm alive'
IDENTIFY_MSG = 'It's me'
IP_ADDR = ''
INTERVAL = 1800

# Datagram (udp) socket
try :
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Socket created'
except socket.error, msg :
print 'Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

try:
s.bind((HOST, PORT))
except socket.error , msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

# broadcast wake-up message
s.sendto(IDENTIFY_MSG,'239.255.255.250')

#now keep listening...how do I not stop listening while sending a packet on an interval?
while 1:
# receive data from client (data, addr)
d = s.recvfrom(1024)
data = d[0]
source_addr = d[1]

if not data:
break

s.sendto(RESPONSE_MSG, source_addr)

最佳答案

我想我有一个可行的解决方案。它在循环复杂性上“下注”了一点,但我相信这是一个干净、可维护、可读的解决方案。

我创建了三个特定的 .py 脚本;第一个打开套接字以发送“唤醒”数据包,第二个打开套接字以发送“事件”数据包,第三个打开套接字以监听/响应设备搜索请求。

然后将它们导入到具有基于计时器的中断的“调用脚本”中。

它看起来是这样的......

import udp_wakeup
import udp_listen
import udp_alive
import shutil
import string
from threading import Timer
import thread, time, sys
from datetime import datetime as dt

#dummy flag to ensure constant looping
restart = 1

def timeout():
thread.interrupt_main()

#Call and execute the wake-up packet broadcast
udp_wakeup.main()

#Initiate timer for 1800 seconds, or 30 minutes
while restart = 1
try:
#Call and execute the listener routine
Timer(1800, timeout).start()
udp_listen.main()
except:
#On Timer expire, break from listener, call Alive-broadcast, reset timer and restart listener
udp_alive.main()

关于Python 与 UDP 监听器重叠计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534160/

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