示例#1
0
        /// <summary>
        /// Starts a pass thru thread.
        /// </summary>
        /// <param name="filter">The filter.</param>
        /// <param name="waitHandles">The wait handles.</param>
        /// <param name="networkAdapters">The network adapters.</param>
        /// <param name="waitHandlesManualResetEvents">The wait handles manual reset events.</param>
        private static void PassThruThread(NdisApi filter, WaitHandle[] waitHandles, IReadOnlyList <NetworkAdapter> networkAdapters, IReadOnlyList <ManualResetEvent> waitHandlesManualResetEvents)
        {
            var ndisApiHelper = new NdisApiHelper();

            var ethPackets = ndisApiHelper.CreateEthMRequest();

            while (true)
            {
                var handle = WaitHandle.WaitAny(waitHandles);
                ethPackets.AdapterHandle = networkAdapters[handle].Handle;

                while (filter.ReadPackets(ref ethPackets))
                {
                    var packets = ethPackets.Packets;
                    for (int i = 0; i < ethPackets.PacketsCount; i++)
                    {
                        var ethPacket = packets[i].GetEthernetPacket(ndisApiHelper);
                        if (ethPacket.PayloadPacket is IPv4Packet iPv4Packet)
                        {
                            if (iPv4Packet.PayloadPacket is TcpPacket tcpPacket)
                            {
                                Console.WriteLine($"{iPv4Packet.SourceAddress}:{tcpPacket.SourcePort} -> {iPv4Packet.DestinationAddress}:{tcpPacket.DestinationPort}.");
                            }
                        }
                    }

                    filter.SendPackets(ref ethPackets);
                    ethPackets.PacketsCount = 0;
                }

                waitHandlesManualResetEvents[handle].Reset();
            }
        }