2

我正在开发 Android 上的 RTP 流代码,我需要在端口(例如 5678)上接收RTP(UDP)数据包并从同一端口(5678)发送RTP 数据包。发送方代码和接收方代码位于不同的位置,因此单个套接字不能同时用于发送和接收。

为此,我需要使用bind()将发送方套接字和接收方套接字绑定到同一个端口。仅在 2 个套接字上使用 bind(),我在第二个 bind() 上出现错误。(如预期)

在对 StackOverflow 上的其他帖子进行搜索后,我发现了一个使用套接字选项SO_REUSEADDR的选项(SO_REUSEPORT在 Linux 上不可用)。

使用SO_REUSEADDR,我可以将两个套接字绑定到同一个端口。发送方套接字能够从该端口发送到()。但是接收器套接字停止显示任何可用于读取的传入数据包(select() + FD_ISSET()侦听方法)。如果 bind() 到其他端口,接收器套接字正常接收另一个端口上的传入数据包。

如此有效,它只有一个套接字能够使用共享端口,而另一个套接字只是被剥夺了任何数据包。

任何改进 SO_REUSEADDR 方法或任何其他方法的建议都将受到高度赞赏。

4

1 回答 1

2

You don't need to bind two sockets on the same port. Android DatagramSocket is bidrectional socket. Simply create one socket and use its receive and send methods. You can use them from different threads (receive and send) if that's an issue.

于 2012-10-17T13:34:04.863 回答