不卡机 2017-10-17 07:25 采纳率: 0%
浏览 1312

为什么经过转发的RTP包无法被VLC正常解析

我通过我自己写的简易转发器测试.Net Core关于网络转发的功能,发现在Rtsp的转发上没有问题,但是RTP的UDP包转发则无法被正确解析,是不是我对协议的理解有疏漏,转发的相关代码如下

public class SocketTransmit
{

    StreamSocketListener TcpOutListener = new StreamSocketListener();
    StreamSocket TcpInSocket = new StreamSocket();
    StreamSocket TcpOutSocket;

    /// <summary>
    /// 向内传递8300-8301端口
    /// </summary>
    DatagramSocket[] UdpInListenerList = new DatagramSocket[2];
    /// <summary>
    /// 向外传递临时端口
    /// </summary>
    DatagramSocket[] UdpOutListenerList = new DatagramSocket[2];

    HostName UdpInRemoteAddress;
    HostName UdpOutRemoteAddress;



    public async void Listen()
    {
        await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
        TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
        await TcpOutListener.BindServiceNameAsync("554");
        Task.Run(new Action(ReadInStream));
    }

    public async void ReListen()
    {
        TcpOutListener.Dispose();
        TcpInSocket.Dispose();
        TcpOutListener = new StreamSocketListener();
        TcpInSocket = new StreamSocket();
        await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
        TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
        await TcpOutListener.BindServiceNameAsync("554");
        Task.Run(new Action(ReadInStream));
    }



    async void ReadInStream()
    {
        while (true)
        {
            StringBuilder request = new StringBuilder();
            uint bufferSize = 2048;
            byte[] data = new byte[bufferSize];
            IBuffer buffer = data.AsBuffer();
            try
            {
                await TcpInSocket.InputStream.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
            }
            catch
            {
                //ReListen();
                //return;
                //TcpInSocket.Dispose();
                //TcpInSocket = new StreamSocket();
                //await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
                //TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
                //Task.Run(new Action(ReadInStream));
                //return;
                //if (TcpOutSocket.Information.RemoteAddress != null)
                //{
                //    TcpInSocket.Dispose();
                //    TcpInSocket = new StreamSocket();
                //    await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
                //}
                //else
                    continue;
            }
            request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
            if (data[0] != 0)
            {
                if (request.ToString().Contains("client_port="))
                {
                    string str = request.ToString();
                    int udpStart = int.Parse(str.Substring(request.ToString().IndexOf("client_port=") + "client_port=".Length, 5));
                    int udpEnd = int.Parse(str.Substring(request.ToString().IndexOf("client_port=") + "client_port=".Length + 6, 5));
                    for (int i = 0; i <= udpEnd - udpStart; i++)
                    {
                        if (i >= 10)
                            break;
                        UdpOutListenerList[i] = new DatagramSocket();
                        UdpOutListenerList[i].BindServiceNameAsync((udpStart + i).ToString());
                        UdpOutListenerList[i].MessageReceived += UdpOutListener_MessageReceived;
                    }
                }
                if (request.ToString().Contains("server_port="))
                {
                    string str = request.ToString();
                    string intttt = str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length, 4);
                    int udpStart = int.Parse(str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length, 4));
                    int udpEnd = int.Parse(str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length + 5, 4));
                    for (int i = 0; i <= udpEnd - udpStart; i++)
                    {
                        if (i >= 2)
                            break;
                        UdpInListenerList[i] = new DatagramSocket();
                        UdpInListenerList[i].BindServiceNameAsync((udpStart + i).ToString());
                        UdpInListenerList[i].MessageReceived += UdpInListener_MessageReceived;
                    }
                }
            }
            try
            {
                await TcpOutSocket.OutputStream.WriteAsync(buffer);
                await TcpOutSocket.OutputStream.FlushAsync();
            }
            catch
            {
                return;
            }
        }
    }

    private async void TcpOutListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
    {
        while (true)
        {
            try
            {
                StringBuilder request = new StringBuilder();
                uint bufferSize = 1024;
                byte[] data = new byte[bufferSize];
                IBuffer buffer = data.AsBuffer();
                uint dataRead = bufferSize;
                await args.Socket.InputStream.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
                request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
                dataRead = buffer.Length;
                TcpOutSocket = args.Socket;
                if (data[0] != 0)
                {
                    await TcpInSocket.OutputStream.WriteAsync(buffer);
                    await TcpInSocket.OutputStream.FlushAsync();
                }
            }
            catch
            {
                break;
            }
        }
        ReListen();
    }

    private async void UdpOutListener_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {
        StringBuilder request = new StringBuilder();
        uint bufferSize = 4096;
        byte[] data = new byte[bufferSize];
        IBuffer buffer = data.AsBuffer();
        uint dataRead = bufferSize;
        await args.GetDataStream().ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
        dataRead = buffer.Length;

        int i = 0;
        for (; i < 2; i++)
        {
            if (UdpInListenerList[i].Information.LocalPort == args.RemotePort)
                break;
        }
        DataWriter dw = new DataWriter(await UdpInListenerList[i].GetOutputStreamAsync(UdpOutRemoteAddress, sender.Information.LocalPort));
        dw.WriteBuffer(buffer);
        await dw.StoreAsync();
        await dw.FlushAsync();
        dw.DetachStream();

    }

    private async void UdpInListener_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {
        StringBuilder request = new StringBuilder();
        uint bufferSize = 4096;
        byte[] data = new byte[bufferSize];
        IBuffer buffer = data.AsBuffer();
        uint dataRead = bufferSize;
        UdpOutRemoteAddress = args.RemoteAddress;
        await args.GetDataStream().ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
        dataRead = buffer.Length;

        int i = 0;
        for (; i < 2; i++)
        {
            if (UdpOutListenerList[i].Information.LocalPort == args.RemotePort)
                break;
        }
        DataWriter dw = new DataWriter(await UdpOutListenerList[i].GetOutputStreamAsync(new HostName("10.1.100.36"), sender.Information.LocalPort));
        dw.WriteBuffer(buffer);
        await dw.StoreAsync();
        await dw.FlushAsync();
        dw.DetachStream();

        //await UdpInListenerList[i].OutputStream.WriteAsync(buffer);


    }
}
  • 写回答

2条回答

  • threenewbee 2017-10-17 17:18
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?