【发布时间】:2012-10-07 18:32:14
【问题描述】:
我正在开发 Android 上的 RTP 流代码,我需要在端口(例如 5678)上接收 RTP (UDP) 数据包并发送 来自同一端口 (5678) 的 RTP 数据包。 Sender code 和 Receiver code 位于不同的位置,因此单个套接字不能同时用于发送和接收。
为了实现这一点,我需要使用 bind() 将发送方套接字和接收方套接字绑定到同一个端口。仅在 2 个套接字上使用 bind(),我在第二个 bind() 上出现错误。 (如预期)
在 StackOverflow 上搜索其他帖子后,我发现了使用套接字选项 SO_REUSEADDR 的选项(SO_REUSEPORT 在 Linux 上不可用)。
使用 SO_REUSEADDR,我可以将两个套接字绑定到同一个端口。发送方套接字能够从该端口发送到()。但是接收器套接字停止显示任何可用于读取的传入数据包(select() + FD_ISSET() 侦听方法)。如果 bind() 到其他端口,接收方套接字正常接收其他端口上的传入数据包。
如此有效,它只有一个套接字能够使用共享端口,而另一个套接字只是被剥夺了任何数据包。
任何对 SO_REUSEADDR 方法或任何其他方法的改进建议都将受到高度赞赏。
【问题讨论】: