public GwTcpListener(Gateway gateway, ChainSide side, IPEndPoint ipSource)
 {
     this.gateway = gateway;
     this.ipSource = ipSource;
     this.side = side;
     tcpListener = new TcpListener(ipSource);
     tcpListener.Start(10);
     tcpListener.BeginAcceptSocket(ReceiveConn, tcpListener);
     if (Log.WillDisplay(System.Diagnostics.TraceEventType.Start))
         Log.TraceEvent(System.Diagnostics.TraceEventType.Start, -1, "TCP Listener " + side.ToString() + " on " + ipSource);
 }
        /// <summary>
        /// Used to populate the chain based on a list of types
        /// </summary>
        /// <param name="gateway"></param>
        /// <param name="side"> </param>
        /// <param name="workersNeeded"></param>
        /// <param name="client"></param>
        /// <param name="server"></param>
        /// <returns></returns>
        static WorkerChain PopulateChain(Gateway gateway, ChainSide side, IEnumerable<Type> workersNeeded, IPEndPoint client, IPEndPoint server)
        {
            WorkerChain chain = new WorkerChain { ClientEndPoint = client, ServerEndPoint = server, Gateway = gateway, Side = side };

            foreach (Type t in workersNeeded)
            {
                // ReSharper disable PossibleNullReferenceException
                Worker w = (Worker)t.GetConstructor(new Type[] { }).Invoke(new object[] { });
                // ReSharper restore PossibleNullReferenceException
                w.Chain = chain;
                w.ClientEndPoint = client;
                w.ServerEndPoint = server;
                chain.Add(w);
            }

            /*lock (lockChainManagement)
            {
                knownChains.Add(chain);
            }*/
            knownChains.Add(chain);

            return chain;
        }
 /// <summary>
 /// Creates a request UDP chain
 /// </summary>
 /// <param name="gateway"></param>
 /// <param name="side"> </param>
 /// <param name="client"></param>
 /// <param name="server"></param>
 /// <returns></returns>
 public static WorkerChain UdpResponseChain(Gateway gateway, ChainSide side, IPEndPoint client, List<IPEndPoint> server)
 {
     return PopulateChain(gateway, side, udpResponseChainList, client, server[0]);
 }
 /// <summary>
 /// Creates a request UDP chain
 /// </summary>
 /// <param name="gateway"></param>
 /// <param name="side"> </param>
 /// <param name="client"></param>
 /// <param name="server"></param>
 /// <returns></returns>
 public static WorkerChain UdpChain(Gateway gateway, ChainSide side, IPEndPoint client, List<IPEndPoint> server)
 {
     WorkerChain res = PopulateChain(gateway, side, udpChainList, client, server[0]);
     res.Destinations = server;
     return res;
 }
 public static WorkerChain UdpBeaconReceiver(Gateway gateway, ChainSide side, IPEndPoint client, List<IPEndPoint> server)
 {
     return PopulateChain(gateway, side, beaconReceiverChainList, client, server[0]);
 }
 /// <summary>
 /// Creates a response TCP chains
 /// </summary>
 /// <param name="gateway"></param>
 /// <param name="side"> </param>
 /// <param name="client"></param>
 /// <param name="server"></param>
 /// <returns></returns>
 public static WorkerChain TcpResponseChain(Gateway gateway, ChainSide side, IPEndPoint client, IPEndPoint server)
 {
     return PopulateChain(gateway, side, tcpResponseChainList, client, server);
 }