2012-10-17 57 views
1

我在RTP流代码工作在Android上,在那里我需要接收 RTP(UDP)数据包的端口上(比如说5678)和同一端口(5678)发送 RTP分组。 发送方代码和接收方代码位于不同的位置,因此单个套接字不能用于发送和接收。如何绑定2个UDP套接字同一端口,一个用于接收和其他用于发送

为了实现这一点,我需要绑定发件人套接字和接收器套接字到相同的端口使用bind()。用2个套接字上的bind(),我得到第二个bind()的错误。 (如预期)

上StackOverflow的其他职位做搜索之后,我发现使用套接字选项SO_REUSEADDR SO_REUSEPORT在Linux上没有可用),的一个选项。

With SO_REUSEADDR,我能够绑定()两个套接字到同一个端口。发件人套接字能够从此端口发送到()。但接收机插座停止示出可用的任何传入的数据包,用于读取(的select() + FD_ISSET()收听的方法)。如果将bind()绑定到其他端口,receiver套接字就会正常收到另一个端口上的传入数据包。

那么有效,它只有一个插座能够使用共享端口,以及其他插座只是剥夺任何数据包。

用于改进SO_REUSEADDR方法或任何其他方法的任何建议将高度赞赏。

回答

2

您不需要在同一端口上绑定两个套接字。 Android DatagramSocket是bidrectional套接字。只需创建一个套接字并使用其receivesend方法即可。如果这是一个问题,您可以使用它们从不同的线程(receivesend)。

+0

嗨Tozka, 非常感谢您的回复。 更具体 1),用于RTP的代码发送&RTP接收是在CPP层,所以java类的DatagramSocket但是不适用。 2)我需要创建2个套接字,因为Receiver&Sender的代码位于2个不同的代码组件中。如果事实上,套接字创建的代码已经在这些单独的组件中。它只是我需要使用特定的端口sendto()(在现有的代码不绑定()到任何端口,并sendto()使用任何短暂的端口。)和Sender-socket的特定端口恰好相同端口Receiver-socket绑定()到。 –

+0

@ kalpesh.patil然后,您需要重新构建这些组件,以便它们使用相同的套接字。您的明显设计错误没有其他解决方案。 – EJP

相关问题