使用 python 重新广播 UDP 流
Re-broadcasting a UDP stream with python
我是 运行 一个简单的关闭套接字侦听器,用于摄取包含 json 定向到本地主机上的端口 5001(在本例中)的 UDP 流:
import socket
import json
from contextlib import closing
def monitor_stream():
with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5001))
while True:
data, addr = s.recvfrom(4096)
try:
data = data.decode('ascii')
data = json.loads(data)
except:
print 'Not valid JSON: ', data
我需要将流重新广播到另一个本地端口(在此示例中为任意 5002),以便第二个程序可以尽可能实时地访问数据。低延迟至关重要。以下(同时使用 socket.sendto() )是可接受的方法吗:
while True:
data, addr = s.recvfrom(4096)
s.sendto(data, ('localhost', 5002))
如果不是,我还能怎样获得相同的结果?
我假设没有办法让多个程序同时摄取原始流,因为它们起源于单播数据包,所以只有第一个绑定套接字接收它们。
其次,我如何将同一个流投射到多个端口(本地或非本地)?
我无法更改传入流端口/设置。
这是对 socket.sendto()
的简单误用,只能在未连接的套接字上调用。
我正在尝试使用绑定侦听器发送摄取的流。
看来您需要两个套接字对象才能重新广播到不同的地址。第二个套接字是未绑定的回显客户端,因为地址在 .sendto(string, address)
中指定
我是 运行 一个简单的关闭套接字侦听器,用于摄取包含 json 定向到本地主机上的端口 5001(在本例中)的 UDP 流:
import socket
import json
from contextlib import closing
def monitor_stream():
with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5001))
while True:
data, addr = s.recvfrom(4096)
try:
data = data.decode('ascii')
data = json.loads(data)
except:
print 'Not valid JSON: ', data
我需要将流重新广播到另一个本地端口(在此示例中为任意 5002),以便第二个程序可以尽可能实时地访问数据。低延迟至关重要。以下(同时使用 socket.sendto() )是可接受的方法吗:
while True:
data, addr = s.recvfrom(4096)
s.sendto(data, ('localhost', 5002))
如果不是,我还能怎样获得相同的结果?
我假设没有办法让多个程序同时摄取原始流,因为它们起源于单播数据包,所以只有第一个绑定套接字接收它们。
其次,我如何将同一个流投射到多个端口(本地或非本地)?
我无法更改传入流端口/设置。
这是对 socket.sendto()
的简单误用,只能在未连接的套接字上调用。
我正在尝试使用绑定侦听器发送摄取的流。
看来您需要两个套接字对象才能重新广播到不同的地址。第二个套接字是未绑定的回显客户端,因为地址在 .sendto(string, address)