Python重叠计时器与UDP侦听器

时间:2015-12-30 17:25:19

标签: python sockets udp listener

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

需要听众的过程有三个要求/责任:

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

这些任务中的每一个都没有问题,前两个很容易包括在内。我不满意的是“中断监听器”或修改监听器的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)

1 个答案:

答案 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()