2

ポート(5678など)でRTP(UDP)パケットを受信し、同じポート(5678)からRTPパケットを送信する必要があるAndroidでRTPストリーミングコードに取り組んでいます。送信側コードと受信側コードは別の場所にあるため、1 つのソケットを送信と受信の両方に使用することはできません。

これを実現するには、 bind()を使用して送信側ソケットと受信側ソケットを同じポートにバインドする必要があります。2 つのソケットで bind() だけを使用すると、2 番目の bind() でエラーが発生します。(予想通り)

StackOverflow の他の投稿を検索した後、ソケット オプションSO_REUSEADDR ( Linux ではSO_REUSEPORTは使用できません) を使用するオプションを見つけました。

SO_REUSEADDRを使用すると、2 つのソケットを同じポートに bind() できます。送信側ソケットは、このポートから sendto() を実行できます。しかし、受信側ソケットは、読み取り可能な着信パケットの表示を停止します ( select() + FD_ISSET()リッスン メソッド)。別のポートに bind() された場合、受信側ソケットは別のポートで着信パケットを正常に受信します。

つまり、1 つのソケットのみが共有ポートを使用でき、他のソケットはパケットを奪われます。

SO_REUSEADDR アプローチまたはその他のアプローチの改善に関する提案は、高く評価されます。

4

1 に答える 1

2

同じポートで 2 つのソケットをバインドする必要はありません。AndroidDatagramSocketは双方向ソケットです。ソケットを 1 つ作成し、そのメソッドreceivesendメソッドを使用するだけです。問題がある場合は、異なるスレッド (receiveおよびsend) からそれらを使用できます。

于 2012-10-17T13:34:04.863 に答える