我正在研究Android上的RTP流代码,我需要端口上的 receive RTP( UDP )数据包(比如5678)和来自 same port (5678)的 send RTP数据包 . 发件人代码和接收器代码位于不同的位置,因此单个插槽不能用于发送和接收 .
为实现此目的,我需要使用 bind() 将发送方套接字和接收方套接字绑定到同一端口 . 只有2个套接字上的bind(),我在第二个bind()上得到错误 . (如预期的那样)
在StackOverflow上搜索其他帖子后,我发现了一个使用socket-option SO_REUSEADDR 的选项( SO_REUSEPORT 在Linux上不可用) .
使用 SO_REUSEADDR ,我能够将两个套接字绑定到同一个端口 . 发送方套接字能够从此端口发送到() . 但接收器套接字停止显示任何可用于读取的传入数据包( select() FD_ISSET() 监听方法) . 如果bind()ed到其他端口,接收器套接字通常会在另一个端口上接收传入的数据包 .
如此有效,它唯一的一个套接字能够使用共享端口,而其他套接字只是被剥夺了任何数据包 .
任何改进SO_REUSEADDR方法或任何其他方法的建议都将受到高度赞赏 .
1 回答
您不需要在同一端口上绑定两个套接字 . Android DatagramSocket是bidrectional socket . 只需创建一个套接字并使用其
receive
和send
方法 . 如果这是一个问题,您可以从不同的线程(receive
和send
)使用它们 .