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)); } } } }
public TCPStreamMonitorStack(TCPIPListenerStack stAlice, TCPIPListenerStack stBob, NetworkStreamMonitor[] mods) { StackAlice = stAlice; StackBob = stBob; Monitors = mods; }