我正在寻找有关在UDP侦听器服务的WHILE循环中包含/的计时器的见解。该服务是我需要与之交互的设备自动发现系统的一部分。
需要听众的过程有三个要求/责任:
这些任务中的每一个都没有问题,前两个很容易包括在内。我不满意的是“中断监听器”或修改监听器的WHILE循环以发送“活”分组。
如果我“等待”间隔,我暂停其他进程。 Scheduler对象是否也会这样做,或者允许我们继续?我不能多线程,因为我需要接收和发送一个特定的端口,这是绑定在线程内。
这是我的......
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)
答案 0 :(得分:1)
我想我的工作解决方案是什么。它" punts"关于循环复杂性,但我相信它是一个干净,可维护,可读的解决方案。
我创建了三个特定的.py脚本;一个打开一个套接字来发送"唤醒"数据包,秒打开一个套接字发送" alive"数据包,第三个打开一个套接字来监听/响应设备搜索请求。
然后将这些导入到"调用脚本"使用基于计时器的中断。
以下是它的外观......
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()