public static int perfmon(UDTSOCKET u, CPerfMon perf, bool clear) { try { CUDT udt = s_UDTUnited.lookup(u); udt.sample(perf, clear); return 0; } catch (CUDTException e) { s_UDTUnited.setError(new CUDTException(e)); return ERROR; } catch (Exception e) { s_UDTUnited.setError(new CUDTException(-1, 0, 0)); return ERROR; } }
public void sample(CPerfMon perf, bool clear) { if (!m_bConnected) throw new CUDTException(2, 2, 0); if (m_bBroken || m_bClosing) throw new CUDTException(2, 1, 0); Int64 currtime = CClock.getTime(); perf.msTimeStamp = (currtime - m_StartTime) / 1000; perf.pktSent = m_llTraceSent; perf.pktRecv = m_llTraceRecv; perf.pktSndLoss = m_iTraceSndLoss; perf.pktRcvLoss = m_iTraceRcvLoss; perf.pktRetrans = m_iTraceRetrans; perf.pktSentACK = m_iSentACK; perf.pktRecvACK = m_iRecvACK; perf.pktSentNAK = m_iSentNAK; perf.pktRecvNAK = m_iRecvNAK; perf.usSndDuration = m_llSndDuration; perf.pktSentTotal = m_llSentTotal; perf.pktRecvTotal = m_llRecvTotal; perf.pktSndLossTotal = m_iSndLossTotal; perf.pktRcvLossTotal = m_iRcvLossTotal; perf.pktRetransTotal = m_iRetransTotal; perf.pktSentACKTotal = m_iSentACKTotal; perf.pktRecvACKTotal = m_iRecvACKTotal; perf.pktSentNAKTotal = m_iSentNAKTotal; perf.pktRecvNAKTotal = m_iRecvNAKTotal; perf.usSndDurationTotal = m_llSndDurationTotal; double interval = (double)(currtime - m_LastSampleTime); perf.mbpsSendRate = (double)(m_llTraceSent) * m_iPayloadSize * 8.0 / interval; perf.mbpsRecvRate = (double)(m_llTraceRecv) * m_iPayloadSize * 8.0 / interval; perf.usPktSndPeriod = m_ullInterval / (double)(m_ullCPUFrequency); perf.pktFlowWindow = m_iFlowWindowSize; perf.pktCongestionWindow = (int)m_dCongestionWindow; perf.pktFlightSize = CSeqNo.seqlen((Int32)(m_iSndLastAck), (Int32)(m_iSndCurrSeqNo)); perf.msRTT = m_iRTT/1000.0; perf.mbpsBandwidth = m_iBandwidth * m_iPayloadSize * 8.0 / 1000000.0; if (WAIT_OBJECT_0 == WaitForSingleObject(m_ConnectionLock, 0)) { perf.byteAvailSndBuf = (null == m_pSndBuffer) ? 0 : (m_iSndBufSize - m_pSndBuffer.getCurrBufSize()) * m_iMSS; perf.byteAvailRcvBuf = (null == m_pRcvBuffer) ? 0 : m_pRcvBuffer.getAvailBufSize() * m_iMSS; m_ConnectionLock.ReleaseMutex(); } else { perf.byteAvailSndBuf = 0; perf.byteAvailRcvBuf = 0; } if (clear) { m_llTraceSent = m_llTraceRecv = m_iTraceSndLoss = m_iTraceSndLoss = m_iTraceRetrans = m_iSentACK = m_iRecvACK = m_iSentNAK = m_iRecvNAK = 0; m_llSndDuration = 0; m_LastSampleTime = currtime; } }
public static int perfmon(UDTSOCKET u, CPerfMon perf) { perfmon(u, perf, true); }
// Functionality: // read the performance data since last sample() call. // Parameters: // 0) [in, out] perf: pointer to a CPerfMon structure to record the performance data. // 1) [in] clear: flag to decide if the local performance trace should be cleared. // Returned value: // None. public void sample(CPerfMon perf) { sample(perf, true); }