예제 #1
0
        public void IsolatedProducer(Dictionary <string, object> parameters)
        {
            //TCPBsonBase.ServerClientCtx ctx = new TCPBsonBase.ServerClientCtx();

            try
            {
                string[] paddr = ListeningOn.Split(':');
                serv = new TcpListener(IPAddress.Any, Int32.Parse(paddr[1]));
                serv.Start();
                logger.Info("TCP queue services Created at {0}, listening on {1}", DateTime.Now, ListeningOn);
            }
            catch (System.Net.Sockets.SocketException e)
            {
                if (e.Message == "Access denied")
                {
                    logger.Exception(e, "http service start listening", "check permissions/firewall parameters...");
                }
                throw;
            }

            serv.BeginAcceptTcpClient(AcceptNewClient, null);
            int ringIndex = 0;

            while (!stopSignal)
            {
                if (activeClients.Count > 0)
                {
                    BsonClient cli = null;
                    lock (activeClients)
                        cli = activeClients[ringIndex];

                    if (cli.ns.DataAvailable)
                    {
                        cli.proc();
                    }
                    else
                    {
                        if (!cli.isAlive)
                        {
                            lock (activeClients)
                                activeClients.RemoveAt(ringIndex);
                            ringIndex--;
                            logger.Debug("Disconnected: {0}", cli.client.Client.RemoteEndPoint);
                        }
                        System.Threading.Thread.Sleep(0);
                    }

                    ringIndex++;
                    if (ringIndex >= activeClients.Count)
                    {
                        ringIndex = 0;
                    }
                }
                else
                {
                    System.Threading.Thread.Sleep(500);
                }
            }
        }
예제 #2
0
        private void AcceptNewClient(IAsyncResult s)
        {
            TcpClient  tc  = serv.EndAcceptTcpClient(s);
            BsonClient cli = new BsonClient(logger)
            {
                ctx    = new TCPBsonBase.ServerClientCtx(),
                client = tc,
                ns     = tc.GetStream()
            };

            cli.ns.ReadTimeout  = 10;
            cli.ctx.PutCallback = pushMessage;
            lock (activeClients)
                activeClients.Add(cli);
            logger.Debug("Connected: {0}", tc.Client.RemoteEndPoint);

            serv.BeginAcceptTcpClient(AcceptNewClient, null);
        }
예제 #3
0
        private void AcceptNewClient(IAsyncResult s)
        {
            TcpClient tc = serv.EndAcceptTcpClient(s);
            BsonClient cli = new BsonClient(logger)
            {
                ctx = new TCPBsonBase.ServerClientCtx(),
                client = tc,
                ns = tc.GetStream()
            };
            cli.ns.ReadTimeout = 10;
            cli.ctx.PutCallback = pushMessage;
            lock (activeClients)
                activeClients.Add(cli);
            logger.Debug("Connected: {0}", tc.Client.RemoteEndPoint);

            serv.BeginAcceptTcpClient(AcceptNewClient, null);
        }