【发布时间】:2016-04-04 16:50:24
【问题描述】:
我正在寻找有关在 UDP 侦听器服务的 WHILE 循环中包含计时器的见解。该服务是我需要与之交互的设备自动发现系统的一部分。
需要监听器的进程有三个要求/职责:
- 在初始套接字绑定时广播通知数据包(设备已启动)
- 收听和回复“搜索”广播
- 无论是否存在“搜索”广播,每 30 分钟广播一次“仍然存在”数据包
单独这些任务中的每一个都没有问题,前两个很容易包含。我不习惯的是“中断监听器”或修改监听器的 WHILE 循环以发送“活动”数据包。
如果我“等待”间隔,我会暂停其他进程。调度器对象会做同样的事情,还是允许我们继续?我不能多线程,因为我需要在线程内绑定的特定端口上接收和发送。
这就是我所拥有的......
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)
【问题讨论】:
-
听起来你想在套接字上设置一个超时,所以 recfrom() 不会永远阻塞。
-
对于在我的示例中遗漏了单引号的“加倍”表示歉意...我取出了专有的东西并且对替换字符串很草率。
-
在某种程度上,是的,乔纳森。这需要是一个持久服务......只要设备/设备通电,我就会监听,所以如果它是“超时”,我需要在发送“活动”数据包后立即恢复监听状态。
-
它应该在哪里工作(Unix,Windows,...)?
标签: python sockets udp listener