/// <summary> /// </summary> /// <param name="queryBuilder"> /// Using <see cref="QueryBy.IPv4"/> or <see cref="QueryBy.IPv6"/> to query tcp status. /// </param> /// <param name="filter"></param> /// <returns></returns> public static IReadOnlyList <ITrafficRow> Execute(IRowAdapter queryBuilder, Predicate <ITrafficRow> filter) { if (queryBuilder == null) { throw new ArgumentNullException(nameof(queryBuilder)); } if (filter == null) { return(Execute(queryBuilder)); } var result = new List <ITrafficRow>(); var buffSize = default(int); var tcpTablePtr = IntPtr.Zero; try { var ret = GetExtendedTcpTable( tcpTablePtr, ref buffSize, true, queryBuilder.AddressFamily); tcpTablePtr = Marshal.AllocHGlobal(buffSize); ret = GetExtendedTcpTable( tcpTablePtr, ref buffSize, true, queryBuilder.AddressFamily); if (ret != 0) { return(result); } var numEntries = queryBuilder.CalculateEntries(tcpTablePtr); var rowPtr = tcpTablePtr + 4; for (int i = 0; i < numEntries; i++) { var row = queryBuilder.Adapt(rowPtr); if (filter.Invoke(row)) { result.Add(row); } rowPtr += queryBuilder.RowSize; } } finally { if (tcpTablePtr != IntPtr.Zero) { Marshal.FreeHGlobal(tcpTablePtr); } } return(result); }
/// <summary> /// </summary> /// <param name="queryBuilder"> /// Using <see cref="QueryBy.IPv4"/> or <see cref="QueryBy.IPv6"/> to query tcp status. /// </param> /// <returns></returns> public static IReadOnlyList <ITrafficRow> Execute(IRowAdapter queryBuilder) { return(Execute(queryBuilder, x => true)); }