如何将UDP数据包复制到两个或多个套接字

时间:2019-01-15 03:27:44

标签: c sockets unix

我试图在同一端口和IP上运行两个守护程序,但一个是服务器,另一个是客户端。是否有一种使用套接字选项的方法,该方法将允许每个套接字拥有该数据包的副本,并让守护程序根据协议过滤掉消息?似乎重用地址阻止了第一个配置的端口,而重用端口可能只是在两个守护程序之间平衡了数据包。

否则,我想创建另一个守护程序来读取套接字并将数据包发送到正确的守护程序。

谢谢

2 个答案:

答案 0 :(得分:0)

最后您是对的,您将需要具有绑定到端口并将数据包转发到正确的守护程序的第三部分。

另一种方法是使用三个端口,并使用防火墙从前端端口重定向到后端端口。但这要复杂得多且不便于移植。但是最后您可以使用QOS或其他东西。协议一词后面有多种可能的用例类型。

答案 1 :(得分:0)

如果您正在接收的UDP数据包是多播或广播数据包,则可以在套接字上设置SO_REUSEADDR(对于基于BSD的OS,SO_REUSEPORT)(使用setsockopt()) ),然后再在套接字上执行bind()-,然后两个套接字都将收到每个传入UDP数据包的副本。 (如果UDP数据包是常规的旧单播数据包OTOH,那么执行上述操作将导致每个接收到的数据包仅由两个UDP套接字之一接收,这不是您想要的)。

但是,请注意:您将两个守护程序称为“客户端”和“服务器”,这意味着这两个守护程序将要相互通信。如果是这种情况,那么通常的方法是将服务器守护程序绑定到一个众所周知的端口号,而客户机守护程序可以绑定到任何端口号(例如,它可以将0作为端口号传递给bind(),然后让操作系统为其选择可用的端口号)。然后,客户端守护程序可以通过向服务器的众所周知的端口号发送一个或多个UDP数据包来启动会话,服务器可以通过以下方式找出客户端正在从哪个端口发送(从而向其发送回复数据包的端口)。检查其recvfrom()调用的第五个参数。在这种情况下,不需要将两个程序绑定到相同的端口,因此不需要进行数据包转发。