/// <summary> /// Stops the client thread /// </summary> public void Stop() { try { if (this.wThread.IsAlive) { this.bRunning = false; this.wThread.Join(200); } if (this.wThread.IsAlive) { this.wThread.Abort(); } if (this.ClientSocket.Connected) { this.CloseSockets(""); } if (this.activeOper != null) { this.activeOper = null; // this.sessione = null; } } catch (ThreadAbortException) { // Do thread deinit here.. } this.wThread = null; if (this.ClientStopped != null) { this.ClientStopped(this, this.remoteAddress); } }
/// <summary> /// Main ClientManager loop /// </summary> private void Manager() { string reason = ""; bRunning = true; char[] splitparms = { '\n' }; byte[] bytes; // Incoming data from the client. networkStream = new NetworkStream(this.ClientSocket); ReceiveBufferSize = (int)this.ClientSocket.GetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer); Server.logger.WriteLine(LogType.Notice, string.Format("ClientManager started for {0}", this.ClientSocket.RemoteEndPoint.ToString())); if (this.ClientStarted != null) { this.ClientStarted(this, this.remoteAddress); } this.SendData("100 CTISERVER WELCOME", "\n"); bytes = new byte[ReceiveBufferSize]; while (bRunning) { string data = null; string command = ""; string parameters = ""; try { if (!this.IsSocketConnected(this.ClientSocket)) { reason = "Remote client has closed the socket"; this.bRunning = false; } int BytesRead = networkStream.Read(bytes, 0, ReceiveBufferSize); data = Encoding.ASCII.GetString(bytes, 0, BytesRead); string[] datas = data.Split(splitparms); if (datas.Length > 0) { for (int pos = 0; pos < datas.Length; pos++) { parameters = ""; command = ""; command = ProtocolParser.Parse(datas[pos], ref parameters); if (command != null) { bool bPresent = false; if (this.activeOper != null) { bPresent = true; } if (!bPresent) { if ((!command.ToUpper().Equals("USER")) & (!command.ToUpper().Equals("PASS")) & (!command.ToUpper().Equals("HELO")) & (!command.ToUpper().Equals("NOOP")) & (!command.ToUpper().Equals("ORIG")) & (!command.ToUpper().Equals("QUIT"))) { command = ""; } } switch (command.ToUpper().Trim()) { #region USER case "USER": if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } bool bAlreadyConnected = false; string ipAlreadyConnected = ""; lock (Server.shared.clients) { if (Server.shared.clients.Count > 0) { for (int i = 0; i < Server.shared.clients.Count; i++) { IEnumerator cls = Server.shared.clients.Values.GetEnumerator(); while (cls.MoveNext()) { ClientManager cl = (ClientManager)cls.Current; if (cl.activeOper != null) { if (cl.activeOper.USERNAME.Equals(parameters)) { bAlreadyConnected = true; } } } } } } if (bAlreadyConnected) { this.SendData("101 KO", "\n"); Server.logger.WriteLine(LogType.Notice, String.Format("Client already connected from {0} with username: {1}", ipAlreadyConnected, parameters)); } else { this.activeOper = new CTIOperator(); this.activeOper.USERNAME = parameters; this.SendData("100 OK", "\n"); } break; #endregion #region PASS case "PASS": if (this.activeOper == null) { this.SendData("101 KO", "\n"); break; } if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } if (this.activeOper.LoadFromCredential(this.activeOper.USERNAME, parameters)) { Server.shared.clients.Add(this.activeOper.EXT, this); this.SendData("102 OK", "\n"); } else { this.SendData("101 KO", "\n"); this.activeOper = null; } break; #endregion #region QUIT case "QUIT": if (this.activeOper != null) { Server.shared.clients.Remove(this.activeOper.EXT); this.activeOper = null; } this.SendData("900 BYE", "\n"); reason = "Remote client closed connection"; this.bRunning = false; break; #endregion #region ORIGINATE case "ORIG": // exten,context,prio if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } string[] parms = parameters.Split('|'); if (parms.Length < 3) { this.SendData("101 ERROR", "\n"); break; } string orig_extn = parms[0]; string orig_cntx = parms[1]; string orig_prio = parms[2]; string ast_cmd = this.BuildOriginateCommand(orig_extn, orig_cntx, orig_prio); Server.AstCTI.SendDataToAsterisk(ast_cmd); this.SendData("100 OK", "\n"); break; #endregion #region HELO and NOOP case "NOOP": this.SendData("100 OK", "\n"); break; case "HELO": this.SendData("100 OK", "\n"); break; #endregion } } } } } catch (IOException) { reason = "Client Socket timeout"; Server.logger.WriteLine(LogType.Notice, reason); bRunning = false; break; } // Timeout catch (SocketException) { reason = "Socket is broken"; Server.logger.WriteLine(LogType.Notice, reason); bRunning = false; break; } catch (ObjectDisposedException ex) { Server.logger.WriteLine(LogType.Debug, string.Format("ObjectDisposedException: {0}", ex.Source)); } catch (Exception ex) { Server.logger.WriteLine(LogType.Error, ex.ToString()); } } this.CloseSockets(reason); if (this.activeOper != null) { Server.shared.clients.Remove(this.activeOper.EXT); } Interlocked.Decrement(ref Server.shared.NumberOfClients); Server.logger.WriteLine(LogType.Notice, String.Format("Number of clients connected: {0}", Server.shared.NumberOfClients)); }
/// <summary> /// Main ClientManager loop /// </summary> private void Manager() { string reason = ""; bRunning = true; char[] splitparms = { '\n' }; byte[] bytes; // Incoming data from the client. networkStream = new NetworkStream(this.ClientSocket); ReceiveBufferSize = (int)this.ClientSocket.GetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer); Server.logger.WriteLine(LogType.Notice, string.Format("ClientManager started for {0}", this.ClientSocket.RemoteEndPoint.ToString())); if (this.ClientStarted != null) this.ClientStarted(this, this.remoteAddress); this.SendData("100 CTISERVER WELCOME", "\n"); bytes = new byte[ReceiveBufferSize]; while (bRunning) { string data = null; string command = ""; string parameters = ""; try { if (!this.IsSocketConnected(this.ClientSocket)) { reason = "Remote client has closed the socket"; this.bRunning = false; } int BytesRead = networkStream.Read(bytes, 0, ReceiveBufferSize); data = Encoding.ASCII.GetString(bytes, 0, BytesRead); string[] datas = data.Split(splitparms); if (datas.Length > 0) { for (int pos = 0; pos < datas.Length; pos++) { parameters = ""; command = ""; command = ProtocolParser.Parse(datas[pos], ref parameters); if (command != null) { bool bPresent = false; if (this.activeOper != null) { bPresent = true; } if (!bPresent) { if ((!command.ToUpper().Equals("USER")) & (!command.ToUpper().Equals("PASS")) & (!command.ToUpper().Equals("HELO")) & (!command.ToUpper().Equals("NOOP")) & (!command.ToUpper().Equals("ORIG")) & (!command.ToUpper().Equals("QUIT"))) { command = ""; } } switch (command.ToUpper().Trim()) { #region USER case "USER": if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } bool bAlreadyConnected = false; string ipAlreadyConnected = ""; lock (Server.shared.clients) { if (Server.shared.clients.Count > 0) { for (int i = 0; i < Server.shared.clients.Count; i++) { IEnumerator cls = Server.shared.clients.Values.GetEnumerator(); while(cls.MoveNext()) { ClientManager cl = (ClientManager)cls.Current; if (cl.activeOper != null) { if (cl.activeOper.USERNAME.Equals(parameters)) { bAlreadyConnected = true; } } } } } } if (bAlreadyConnected) { this.SendData("101 KO", "\n"); Server.logger.WriteLine(LogType.Notice, String.Format("Client already connected from {0} with username: {1}", ipAlreadyConnected, parameters)); } else { this.activeOper = new CTIOperator(); this.activeOper.USERNAME = parameters; this.SendData("100 OK", "\n"); } break; #endregion #region PASS case "PASS": if (this.activeOper == null) { this.SendData("101 KO", "\n"); break; } if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } if (this.activeOper.LoadFromCredential(this.activeOper.USERNAME, parameters)) { Server.shared.clients.Add(this.activeOper.EXT, this); this.SendData("102 OK", "\n"); } else { this.SendData("101 KO", "\n"); this.activeOper = null; } break; #endregion #region QUIT case "QUIT": if (this.activeOper != null) { Server.shared.clients.Remove(this.activeOper.EXT); this.activeOper = null; } this.SendData("900 BYE", "\n"); reason = "Remote client closed connection"; this.bRunning = false; break; #endregion #region ORIGINATE case "ORIG": // exten,context,prio if (!checkParameters(parameters)) { this.SendData("101 ERROR", "\n"); break; } string[] parms = parameters.Split('|'); if (parms.Length < 3) { this.SendData("101 ERROR", "\n"); break; } string orig_extn = parms[0]; string orig_cntx = parms[1]; string orig_prio = parms[2]; string ast_cmd = this.BuildOriginateCommand(orig_extn, orig_cntx, orig_prio); Server.AstCTI.SendDataToAsterisk(ast_cmd); this.SendData("100 OK", "\n"); break; #endregion #region HELO and NOOP case "NOOP": this.SendData("100 OK", "\n"); break; case "HELO": this.SendData("100 OK", "\n"); break; #endregion } } } } } catch (IOException) { reason = "Client Socket timeout"; Server.logger.WriteLine(LogType.Notice, reason); bRunning = false; break; } // Timeout catch (SocketException) { reason = "Socket is broken"; Server.logger.WriteLine(LogType.Notice, reason); bRunning = false; break; } catch (ObjectDisposedException ex) { Server.logger.WriteLine(LogType.Debug, string.Format("ObjectDisposedException: {0}",ex.Source)); } catch (Exception ex) { Server.logger.WriteLine(LogType.Error, ex.ToString()); } } this.CloseSockets(reason); if (this.activeOper != null) Server.shared.clients.Remove(this.activeOper.EXT); Interlocked.Decrement(ref Server.shared.NumberOfClients); Server.logger.WriteLine(LogType.Notice, String.Format("Number of clients connected: {0}",Server.shared.NumberOfClients)); }
/// <summary> /// Stops the client thread /// </summary> public void Stop() { try { if (this.wThread.IsAlive) { this.bRunning = false; this.wThread.Join(200); } if (this.wThread.IsAlive) { this.wThread.Abort(); } if (this.ClientSocket.Connected) { this.CloseSockets(""); } if (this.activeOper != null) { this.activeOper = null; // this.sessione = null; } } catch (ThreadAbortException) { // Do thread deinit here.. } this.wThread = null; if (this.ClientStopped != null) this.ClientStopped(this, this.remoteAddress); }