/// <summary>
        /// Process Auto Detect feature
        /// </summary>
        /// <param name="pdu"></param>
        public override void ProcessSubHeaders(RdpemtBasePDU pdu)
        {
            if (pdu == null || pdu.TunnelHeader == null)
            {
                return;
            }

            if (detectBandwidth)
            {
                // if detect device, count bytes
                bandwidthMeasurePayloadByteCount += ((uint)pdu.TunnelHeader.PayloadLength + pdu.TunnelHeader.HeaderLength);
            }

            RDP_TUNNEL_SUBHEADER[] RDPTunnelSubHeaders = pdu.TunnelHeader.SubHeaders;
            if (RDPTunnelSubHeaders != null)
            {
                foreach (RDP_TUNNEL_SUBHEADER RDPTunnelSubHeader in RDPTunnelSubHeaders)
                {
                    if (RDPTunnelSubHeader.SubHeaderType == RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_REQUEST)
                    {
                        uint sequenceNumber = (uint)(RDPTunnelSubHeader.SubHeaderData[1] << 8) + RDPTunnelSubHeader.SubHeaderData[0];
                        uint responseType   = (uint)(RDPTunnelSubHeader.SubHeaderData[3] << 8) + RDPTunnelSubHeader.SubHeaderData[2];
                        if (responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_BW_START_AFTER_CONNECTTIME_OR_LOSSYUDP ||
                            responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_BW_START_AFTER_CONNECTTIME_OR_RELIABLEUDP)
                        {
                            // Start bandwidth detect
                            bandwidthMeasureStartTime        = DateTime.Now;
                            bandwidthMeasurePayloadByteCount = 0;
                            detectBandwidth = true;
                        }
                        else if (responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_BW_STOP_AFTER_CONNECTTIME_OR_LOSSYUDP ||
                                 responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_BW_STOP_AFTER_CONNECTTIME_OR_RELIABLEUDP)
                        {
                            detectBandwidth = false;
                            TimeSpan duration = DateTime.Now - bandwidthMeasureStartTime;
                            this.timeDelta       = (uint)duration.TotalMilliseconds;
                            bwStopSequenceNumber = (ushort)sequenceNumber;
                            // Send RDP_BW_RESULTS
                            if (AutoHandle)
                            {
                                byte[]        subHeader  = GenerateSubHander_BWResult();
                                List <byte[]> subHeaders = new List <byte[]>();
                                subHeaders.Add(subHeader);
                                RDP_TUNNEL_DATA tunnelData = CreateTunnelDataPdu(null, subHeaders, RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_RESPONSE);
                                this.SendRdpemtPacket(tunnelData);
                            }
                        }
                        else if (responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_NETCHAR_RESULT_BANDWIDTH_AVERAGERTT ||
                                 responseType == (uint)AUTO_DETECT_REQUEST_TYPE.RDP_NETCHAR_RESULT_BASERTT_BANDWIDTH_AVERAGERTT)
                        {
                            // Update bandwidth
                            RDP_NETCHAR_RESULT ncRes = RdpemtUtility.ParseRdpNetCharResult(RDPTunnelSubHeader.SubHeaderData);
                            this.bandwidth = ncRes.bandwidth;
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Process Auto Detect feature
 /// </summary>
 /// <param name="pdu"></param>
 public override void ProcessSubHeaders(RdpemtBasePDU pdu)
 {
     RDP_TUNNEL_SUBHEADER[] RDPTunnelSubHeaders = pdu.TunnelHeader.SubHeaders;
     if (RDPTunnelSubHeaders != null)
     {
         foreach (RDP_TUNNEL_SUBHEADER RDPTunnelSubHeader in RDPTunnelSubHeaders)
         {
             if (RDPTunnelSubHeader.SubHeaderType == RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_RESPONSE)
             {
                 uint responseType = (uint)(RDPTunnelSubHeader.SubHeaderData[3] << 8) + RDPTunnelSubHeader.SubHeaderData[2];
                 if (responseType == (uint)AUTO_DETECT_RESPONSE_TYPE.RDP_BW_RESULTS_AFTER_CONNECT)
                 {
                     RDP_BW_RESULTS bwRes = RdpemtUtility.ParseRdpBWResults(RDPTunnelSubHeader.SubHeaderData);
                     this.bandwidth = (bwRes.byteCount * 8) / bwRes.timeDelta;
                 }
             }
         }
     }
 }