我有两个独立的网络对等点,它们都使用相同的目标端口通过UDP将视频数据发送到单个主机。
例如
protocol src_addr src_port dst_addr dst_port UDP peer1 ephemeral host1 5555 UDP peer2 ephemeral host1 5555
我可以让一个套接字接收两个流,然后根据src_addr
将视频数据分配给适当的解码引擎;但是在没有单个接收套接字的情况下 达到相同结果的最佳方法是什么(这是可取的,因为我希望两个解码都是独立的应用程序)?
感觉应该有可能,因为每个视频数据流在上表中都有唯一标识。
主要问题是,当两个单独的接收应用程序中的两个套接字尝试绑定到同一端口时,bind()
失败。
选项:
1)SO_REUSEADDR
和connect()
我可以使用SO_REUSEADDR
允许两个套接字绑定到同一端口吗?后续对connect()
的调用是否将适当的数据报过滤到适当的应用程序?还是将所有数据报仍传递到第一个套接字?
2)SO_REUSEPORT
和connect()
SO_REUSEPORT
似乎用于实现上述目的,例如,负载均衡。如何选择接收插座?并且会尊重connect()
吗?
对Linux内核(net/core/sock_reuseport.c
)中的代码进行快速浏览后,会发现它是随机选择的,除非设置了Berkeley数据包过滤器。
3)伯克利数据包过滤器
这是明智的做法吗?