从多个对等端接收和过滤具有相同目标端口的UDP数据包

时间:2019-05-17 11:15:11

标签: linux sockets udp

我有两个独立的网络对等点,它们都使用相同的目标端口通过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_REUSEADDRconnect()

我可以使用SO_REUSEADDR允许两个套接字绑定到同一端口吗?后续对connect()的调用是否将适当的数据报过滤到适当的应用程序?还是将所有数据报仍传递到第一个套接字?

2)SO_REUSEPORTconnect()

SO_REUSEPORT似乎用于实现上述目的,例如,负载均衡。如何选择接收插座?并且会尊重connect()吗?

对Linux内核(net/core/sock_reuseport.c)中的代码进行快速浏览后,会发现它是随机选择的,除非设置了Berkeley数据包过滤器。

3)伯克利数据包过滤器

这是明智的做法吗?

0 个答案:

没有答案