android - 如何将2个UDP套接字绑定(bind)到同一个端口,一个用于接收,另一个用于发送

标签 android linux sockets udp

我正在 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 。只需创建一个套接字并使用其 receivesend 方法即可。如果存在问题,您可以从不同的线程(接收发送)使用它们。

关于android - 如何将2个UDP套接字绑定(bind)到同一个端口,一个用于接收,另一个用于发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12935358/

相关文章:

perl - 如何将套接字复制到其他变量

java - 如何将文件写入 Android 中的外部公共(public)存储以便它们在 Windows 中可见?

android - 使用 View 翻转器浏览 Web View 的动画

java - DDMS java 分析器显示 : java/lang/StringBuilder. <init> - 它在我的代码中的什么位置?

windows - 用于在同一项目上使用 Windows 和 Linux 的 eclipse 字符集

Java - Swing UI 独立的套接字逻辑

android - 如何在主屏幕android上实现图标动画?

c - 为什么 strace 显示 ERESTARTSYS 供读取?

使用 pthread 时,使用全局变量的 C++ 显示比指针慢 100%?

通过服务器连接 2 个套接字客户端