示例#1
0
        protected override void HandleTraffic(Frame fInputFrame)
        {
            if (!bIsShuttingDown)
            {
                IP.IPFrame   ipFrame  = GetIPFrame(fInputFrame);
                TCP.TCPFrame tcpFrame = GetTCPFrame(fInputFrame);

                if (ipFrame == null || tcpFrame == null)
                {
                    return;
                }

                if (!ShouldIntercept(ipFrame.SourceAddress, ipFrame.DestinationAddress, tcpFrame.SourcePort, tcpFrame.DestinationPort))
                {
                    return;
                }

                bool bFound = false;

                lock (lStacks)
                {
                    foreach (TCPStreamMonitorStack tcpStack in lStacks)
                    {
                        if (tcpStack.StackAlice.PushUp(fInputFrame, false) || tcpStack.StackBob.PushUp(fInputFrame, false))
                        {
                            bFound = true;
                            break;
                        }
                    }

                    if (!bFound)
                    {
                        //We have to create a new stack...

                        TCPIPListenerStack     sAlice;
                        TCPIPListenerStack     sBob;
                        NetworkStreamMonitor[] arMonitors;

                        sBob = new TCPIPListenerStack(ipFrame.DestinationAddress, ipFrame.SourceAddress, tcpFrame.DestinationPort, tcpFrame.SourcePort);
                        sBob.ProtocolParser = this.ProtocolParser;
                        sAlice = new TCPIPListenerStack(ipFrame.SourceAddress, ipFrame.DestinationAddress, tcpFrame.SourcePort, tcpFrame.DestinationPort);
                        sAlice.ProtocolParser = this.ProtocolParser;

                        sAlice.TCPSocket.StateChange += new EventHandler <TCPListenerSocketEventArgs>(TCPSocket_StateChange);
                        sBob.TCPSocket.StateChange   += new EventHandler <TCPListenerSocketEventArgs>(TCPSocket_StateChange);

                        arMonitors = CreateAndLinkStreamMonitors(new SocketNetworkStream(sAlice), new SocketNetworkStream(sBob));

                        TCPStreamMonitorStack tsmsStack = new TCPStreamMonitorStack(sAlice, sBob, arMonitors);

                        foreach (NetworkStreamMonitor nsMonitor in tsmsStack.Monitors)
                        {
                            nsMonitor.Start();
                            nsMonitor.LoopError  += new ExceptionEventHandler(nsMonitor_LoopError);
                            nsMonitor.LoopClosed += new EventHandler(nsMonitor_LoopClosed);
                        }

                        tsmsStack.StackBob.Listen();
                        tsmsStack.StackBob.PushUp(ipFrame, false);

                        tsmsStack.StackAlice.Connect();

                        lStacks.Add(tsmsStack);

                        //Notify Created
                        InvokeExternal(StackCreated, new TCPStreamMonitorEventArgs(tsmsStack));
                    }
                }
            }
        }
示例#2
0
 public TCPStreamMonitorStack(TCPIPListenerStack stAlice, TCPIPListenerStack stBob, NetworkStreamMonitor[] mods)
 {
     StackAlice = stAlice;
     StackBob   = stBob;
     Monitors   = mods;
 }