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); } } }
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); }