【发布时间】:2019-01-15 03:27:44
【问题描述】:
我试图让两个守护进程在相同的端口和 IP 上运行,但一个是服务器,另一个是客户端。是否有使用套接字选项的方法,允许每个套接字拥有数据包的副本并让守护进程根据协议过滤掉消息?看起来重用地址会阻塞第一个配置的端口,而重用端口可能只是平衡两个守护进程之间的数据包。
否则,我想创建另一个守护进程来读取套接字并将数据包发送到正确的守护进程。
谢谢
【问题讨论】:
我试图让两个守护进程在相同的端口和 IP 上运行,但一个是服务器,另一个是客户端。是否有使用套接字选项的方法,允许每个套接字拥有数据包的副本并让守护进程根据协议过滤掉消息?看起来重用地址会阻塞第一个配置的端口,而重用端口可能只是平衡两个守护进程之间的数据包。
否则,我想创建另一个守护进程来读取套接字并将数据包发送到正确的守护进程。
谢谢
【问题讨论】:
最后你是正确的,你需要有一个绑定到端口并将数据包转发到正确的守护进程的第三方。
另一种方法是使用三个端口并使用防火墙从前端端口重定向到后端端口;但这要复杂得多,而且不便携。但最后你可以使用 QOS 或其他东西。协议一词背后有多种可能的用例类型。
【讨论】:
如果您接收的 UDP 数据包是多播或广播数据包,那么您可以在 bind() 之前在套接字上设置SO_REUSEADDR(对于基于 BSD 的操作系统,SO_REUSEPORT)(使用setsockopt())- ing 套接字,然后两个套接字都会收到每个传入 UDP 数据包的副本。 (如果 UDP 数据包是常规的旧单播数据包,OTOH,那么执行上述操作将导致每个接收到的数据包仅由两个 UDP 套接字之一接收,这不是您想要的)。
但是请注意:您将这两个守护进程称为“客户端”和“服务器”——这些术语的含义是这两个守护进程将相互通信。如果是这种情况,那么典型的方法是让服务器守护进程绑定到一个众所周知的端口号,而客户端守护进程可以绑定到任何端口号(例如,它可以将 0 作为端口号传递给bind(),并让操作系统为其选择一个可用的端口号)。然后客户端守护进程可以通过向服务器的已知端口号发送一个或多个 UDP 数据包来开始对话,服务器可以通过检查其recvfrom() 调用的第五个参数。在这种情况下,两个程序不需要绑定到同一个端口,因此不需要数据包转发。
【讨论】: