2

Managed Media Aggregation C#ライブラリ( http://net7mma.codeplex.com)を使用して、FreeboxSetトップボックスからのRTSP/RTPストリームを処理しようとしています。

libはサンプルRTSPフィードで正常に機能しますが、セットトップボックスからのフィードを操作する場合、RTPリスナーソケット(特定のポートですべての収入をリッスンする単純なUDPソケット)はSocketException:ConnectionResetをスローし、もちろんデータはありません受信中に表示されます(データはWiresharkで表示されます)。

SocketIOトリックを介してE_CONNRESETを抑制しても、それほど多くはありませんでしたが、それでもソケットにデータは入りませんでした。

何がそのような振る舞いを引き起こすでしょうか?

(必要に応じて、ソースまたはWiresharkトレースを提供できます)

4

2 に答える 2

8

Microsoftは、SIO_UDP_CONNRESETの真の意味を次のように説明しています。

SIO_UDP_CONNRESET(オペコード設定:I、T == 3)

Windows XP:  Controls whether UDP PORT_UNREACHABLE messages are reported.
- Set to TRUE to enable reporting.
- Set to FALSE to disable reporting.

問題は、実際には接続のリセットではなく、到達可能性です。

MSDNは、エラーWSAECONNRESETについて説明しています。

WSAECONNRESET

仮想回線は、リモート側がハードクローズまたはアボートクローズを実行することによってリセットされました。アプリケーションはソケットを閉じる必要があります。使用できなくなりました。UDPデータグラムソケットでは、このエラーは、前の送信操作がICMPポート到達不能メッセージをもたらしたことを示します。

于 2013-03-05T19:12:55.367 に答える
1

私はnet7mmaの作者です。

これを解決するためにあなたの助けに本当に感謝します。

WinSockまたはWindowsネットワークスタックの別の部分にバグがある可能性があります。これがMonoAlsoで起こるかどうか聞いてみたいです。

ただし、OPとの会話に基づいて、これが発生しているように見える理由は、Freeboxがdescribe要求で示されているものと同じではないポートでパケットを送信しているためです。

プロジェクトページで機会があれば、これについて少し情報を投稿しますが、それまでの間、これについて検索している人々とFreeboxが可能な限り最高の情報を入手できるようにしたいと思いました。

RtpClient -> RecieveData

変化 :

received = socket.Receive(m_Buffer, received, Math.Min(socket.Available,  m_Buffer.Length), SocketFlags.None, out error);

var tc = GetContextBySocketHandle(socket.Handle);
EndPoint fbRtp = new IPEndPoint(tc.RemoteRtp.Address, 0);//Any port
received = socket.ReceiveFrom(m_Buffer, SocketFlags.None, ref fbRtp);

これにより、stbがrtpまたはrtcpポートを正しく報告しないため、ソケットが任意のポートで受信できるようになります。クライアントが複数あり、このコードを使用する場合は、別のストリームから意図せずにパケットを受信する可能性があるため、注意してください。単一のクライアントを使用している場合でも、同じストリームのRtcpポートが、この受信で意図せずにパケットを盗み込む可能性があります。

これが機能する場合の最善のアクションは、RtspClientとRtpClientから派生し、これを適切に処理できるFreeboxRtspClientとFreeboxRtpClientを作成することです。

ボックスが別のポートでパケットを送信している理由の韻を誰かが見つけることができれば、現在の実装に変更を加えて、派生する必要がないことをうれしく思います。

ここに添付:http://net7mma.codeplex.com/workitem/16024

会話全体を示すPcapキャプチャを見つけることができます。

-ジェイ

于 2013-03-07T16:10:22.813 に答える