-1

不久前我遇到了这个问题,最近的一个讨论提醒我,我不知道如何解决它......
假设你有一个服务器和客户端通过 UDP 通信。
您的客户端侦听 UDP 端口 X 并接收服务器数据包。
然后启动第 3 方进程,它也在侦听 UDP 端口 X。
现在它可能会读取我的客户端要接收的数据包并将它们从队列中删除,而我的客户端根本不会收到它们。

或者更糟糕的是,如果客户端向服务器发送 UDP 消息,那么它会为它们分配 TCP 端口以进行连接。服务器仍然必须连接到客户端知道的恒定 UDP 端口 X,即使它正在使用中,否则没有人能够连接到它。

我该如何预防?

4

2 回答 2

2

所有想要共享端口的进程都必须设置 SO_REUSEADDR。如果他们不这样做,第一个绑定到端口的人会得到它,而其他人则失败。所以,(a) 不要设置 SO_REUSEADDR,并且 (b) 是第一个绑定到端口的。如果你不是第一个,你会得到一个绑定错误。

于 2012-09-15T13:58:36.640 回答
1

只有单播 UDP 数据包可以被“窃取”,实际发生的是 IP 堆栈只会传递给第一个绑定的应用程序。

解决方案是管理性的:成为第一个执行绑定到所需端口的应用程序。

于 2012-09-14T15:00:43.500 回答