/// <summary> /// Wait for a Tunnel Data PDU with RDP_BW_RESULTS and check its sequenceNumber. /// </summary> /// <param name="requestedProtocol">Which tunnel to be used, reliable or lossy</param> /// <param name="sequenceNumber"></param> /// <param name="timeout"></param> private void WaitForAndCheckTunnelDataPdu_BWResult(Multitransport_Protocol_value requestedProtocol, ushort sequenceNumber, TimeSpan timeout, bool NegiveLossy = false) { bool isReceived = false; TimeSpan leftTime = timeout; DateTime expiratedTime = DateTime.Now + timeout; RDP_BW_RESULTS bwResult = null; RdpemtServer rdpemtServer = rdpemtServerR; if (requestedProtocol == Multitransport_Protocol_value.INITITATE_REQUEST_PROTOCOL_UDPFECL) { rdpemtServer = rdpemtServerL; } while (!isReceived && leftTime.CompareTo(new TimeSpan(0)) > 0) { try { RDP_TUNNEL_DATA tunnelData = rdpemtServer.ExpectTunnelData(leftTime); if (tunnelData != null) { RDP_TUNNEL_SUBHEADER[] SubHeaders = tunnelData.TunnelHeader.SubHeaders; if (SubHeaders != null) { foreach (RDP_TUNNEL_SUBHEADER subHeader in SubHeaders) { if (subHeader.SubHeaderType == RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_RESPONSE) { NETWORK_DETECTION_RESPONSE detectRsp = rdpbcgrServer.ParseNetworkDetectionResponse(subHeader.SubHeaderData, true); { if (detectRsp.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_BW_RESULTS_AFTER_CONNECT) { bwResult = (RDP_BW_RESULTS)detectRsp; isReceived = true; bwDataStore.byteCount = bwResult.byteCount; bwDataStore.timeDelta = bwResult.timeDelta; Site.Log.Add(LogEntryKind.Comment, "ByteCount: {0} Bytes\tTimeDelta: {1} Milliseconds", bwDataStore.byteCount, bwDataStore.timeDelta); } } } } } } } catch (TimeoutException) { if (NegiveLossy) { Site.Log.Add(LogEntryKind.Comment, "If the sequenceNumber of RDP_BW_STOP is different from that in RDP_BW_START, Client should not send RDP_BW_RESULTS"); } else { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_BW_RESULTS"); } } catch (InvalidOperationException ex) { //break; Site.Log.Add(LogEntryKind.Warning, "Exception thrown out when receiving client PDUs {0}.", ex.Message); } finally { System.Threading.Thread.Sleep(100);//Wait some time for next packet. leftTime = expiratedTime - DateTime.Now; } } if (isReceived) { VerifyTunnelDataPdu_BWResult(bwResult, sequenceNumber); if (NegiveLossy) { Site.Assert.Fail("If the sequenceNumber of RDP_BW_STOP is different from that in RDP_BW_START, Client should not send RDP_BW_RESULTS"); } } else { if (NegiveLossy) { Site.Log.Add(LogEntryKind.Comment, "If the sequenceNumber of RDP_BW_STOP is different from that in RDP_BW_START, Client should not send RDP_BW_RESULTS"); } else { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_BW_RESULTS"); } } }
/// <summary> /// Wait for a Tunnel Data PDU with RDP_RTT_RESPONSE and check its sequenceNumber. /// </summary> /// <param name="requestedProtocol">Which tunnel to be used, reliable or lossy</param> /// <param name="sequenceNumber"></param> /// <param name="timeout"></param> private void WaitForAndCheckTunnelDataPdu_RTTResponse(Multitransport_Protocol_value requestedProtocol, ushort sequenceNumber, TimeSpan timeout) { bool isReceived = false; TimeSpan leftTime = timeout; DateTime expiratedTime = DateTime.Now + timeout; RDP_RTT_RESPONSE rttResponse = null; RdpemtServer rdpemtServer = rdpemtServerR; if (requestedProtocol == Multitransport_Protocol_value.INITITATE_REQUEST_PROTOCOL_UDPFECL) { rdpemtServer = rdpemtServerL; } while (!isReceived && leftTime.CompareTo(new TimeSpan(0)) > 0) { try { RDP_TUNNEL_DATA tunnelData = rdpemtServer.ExpectTunnelData(leftTime); if (tunnelData != null) { RDP_TUNNEL_SUBHEADER[] SubHeaders = tunnelData.TunnelHeader.SubHeaders; if (SubHeaders != null) { foreach (RDP_TUNNEL_SUBHEADER subHeader in SubHeaders) { if (subHeader.SubHeaderType == RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_RESPONSE) { NETWORK_DETECTION_RESPONSE detectRsp = rdpbcgrServer.ParseNetworkDetectionResponse(subHeader.SubHeaderData, true); { if (detectRsp.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_RTT_RESPONSE) { rttResponse = (RDP_RTT_RESPONSE)detectRsp; isReceived = true; rttDataStore.responseTime = DateTime.Now; Site.Log.Add(LogEntryKind.Comment, "RequestTime: {0}\tResponseTime: {1}", rttDataStore.responseTime.Ticks, rttDataStore.responseTime.Ticks); } } } } } } } catch (TimeoutException) { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_RTT_RESULTS"); } catch (InvalidOperationException ex) { //break; Site.Log.Add(LogEntryKind.Warning, "Exception thrown out when receiving client PDUs {0}.", ex.Message); } finally { System.Threading.Thread.Sleep(100);//Wait some time for next packet. leftTime = expiratedTime - DateTime.Now; } } if (isReceived) { VerifyTunnelDataPdu_RTTResponse(rttResponse, sequenceNumber); } else { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_RTT_RESULTS"); } }