【问题标题】:How to bind 2 UDP sockets to same port, one for receiving and other for sending如何将 2 个 UDP 套接字绑定到同一个端口,一个用于接收,另一个用于发送
【发布时间】:2012-10-07 18:32:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: android linux sockets udp


    【解决方案1】:

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

    【讨论】:

    • 您好 Tozka,非常感谢您的回复。更具体地说 1) RTP 发送和 RTP 接收的代码在 CPP 层,所以 java 类 DatagramSocket 在那里不可用。 2) 我需要创建 2 个套接字,因为 Receiver & Sender 的代码位于 2 个不同的代码组件中。事实上,用于创建套接字的代码已经在这些单独的组件中。它只是我需要为 sendto() 使用特定端口(在现有代码中,它没有绑定()到任何端口,并且 sendto() 使用任何临时端口。)并且 Sender-socket 的特定端口恰好是相同的端口 Receiver-socket 被绑定()到。
    • @kalpesh.patil 然后您需要重新架构这些组件,以便它们使用相同的套接字。您明显的设计错误没有其他解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2018-05-12
    • 2023-04-02
    • 1970-01-01
    • 2021-07-08
    • 2011-07-25
    • 2020-01-16
    相关资源
    最近更新 更多