我正在 Android 上开发 RTP 流代码,我需要在端口(例如 5678)上接收 RTP (UDP) 数据包并发送 来自同一端口的 RTP 数据包 (5678)。 发送者代码和接收者代码位于不同的位置,因此单个套接字不能同时用于发送和接收。
为了实现此目的,我需要使用 bind() 将发送方套接字和接收方套接字绑定(bind)到同一端口。仅在 2 个套接字上使用 bind() 时,我在第二个 bind() 上收到错误。 (如预期)
在 StackOverflow 上搜索其他帖子后,我发现了一个使用套接字选项 SO_REUSEADDR 的选项(SO_REUSEPORT 在 Linux 上不可用)。
使用SO_REUSEADDR,我可以将两个套接字绑定(bind)()到同一端口。发送方套接字能够从此端口发送至()。但是接收器套接字停止显示任何可供读取的传入数据包(select() + FD_ISSET() 监听方法)。如果bind()到其他端口,接收套接字会正常接收另一个端口上的传入数据包。
因此,它只有一个套接字能够使用共享端口,而其他套接字只是被剥夺任何数据包。
任何有关 SO_REUSEADDR 方法或任何其他方法改进的建议将受到高度赞赏。
最佳答案
您不需要在同一端口上绑定(bind)两个套接字。安卓DatagramSocket
是双向 socket 。只需创建一个套接字并使用其 receive
和 send
方法即可。如果存在问题,您可以从不同的线程(接收
和发送
)使用它们。
关于android - 如何将2个UDP套接字绑定(bind)到同一个端口,一个用于接收,另一个用于发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12935358/