用python重新广播UDP流

时间:2020-07-17 13:24:09

标签: python sockets udp

我正在运行一个简单的关闭套接字侦听器,以接收包含指向localhost上端口5001(在此示例中)的json的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))

如果没有,我还能如何获得相同的结果?

我已经假定没有办法让多个程序同时以原始方式摄取原始流,因为它们起源于单播数据包,因此只有第一个绑定的套接字才能接收它们。

第二,我如何将同一流投射到多个端口(本地或非本地)?

我无法更改传入的流端口/设置。

1 个答案:

答案 0 :(得分:0)

这是对socket.sendto()的简单误用,只能在未连接的套接字上调用。

我正在尝试使用绑定侦听器发送摄取的流。

我似乎需要两个套接字对象才能重新广播到另一个地址。第二个套接字是未绑定的回显客户端,因为地址是在.sendto(string, address)

中指定的