private bool SendCommandToServer(OTCNetMessage cmd) { try { semaphor.WaitOne(); // Formatea los datos necesarios del mensaje if (String.IsNullOrEmpty(cmd.Message)) { SetMetaDataIfIsNull(cmd); } // Envia la longitud del mensaje byte[] buffer = new byte[4]; buffer = BitConverter.GetBytes((int)cmd.ToByte().Length); _networkStream.Write(buffer, 0, 4); _networkStream.Flush(); // Envia el mensaje buffer = cmd.ToByte(); _networkStream.Write(buffer, 0, buffer.Length); _networkStream.Flush(); semaphor.Release(); return(true); } catch { semaphor.Release(); return(false); } }
private void StartReceive(object sender, DoWorkEventArgs e) { while (_clientSocket.Connected) { if (_networkStream.DataAvailable) { // Obtiene la longitud del mensaje byte[] buffer = new byte[4]; int readBytes = _networkStream.Read(buffer, 0, 4); if (readBytes == 0) { break; } int numbytes = BitConverter.ToInt32(buffer, 0); // Lee los bytes del mensaje buffer = new byte[numbytes]; readBytes = _networkStream.Read(buffer, 0, numbytes); if (readBytes == 0) { break; } // Convierte los datos en el mensaje OTCNetMessage cmd = new OTCNetMessage(buffer); OnCommandReceived(new CommandEventArgs(cmd)); } } OnServerDisconnected(new ServerEventArgs(_clientSocket)); Disconnect(); }
private void SendExistanceCommand(IPAddress ToIP, bool isExists) { OTCNetMessage cmdExistance = new OTCNetMessage(OTCNetMessage.CommandType.IsNameExists, ToIP, isExists.ToString()); cmdExistance.FromIP = _serverIP; cmdExistance.From = SERVER_LOGIN; SendCommandToTarget(cmdExistance); }
private void BroadCastCommand(OTCNetMessage cmd) { foreach (OTCNetServerClient mngr in _clients) { if (!mngr.IP.Equals(cmd.FromIP)) { mngr.SendCommand(cmd); } } }
private void SendCommandToTarget(OTCNetMessage cmd) { foreach (OTCNetServerClient mngr in _clients) { if (mngr.IP.Equals(cmd.ToIP)) { mngr.SendCommand(cmd); return; } } }
private void SendClientListToNewClient(IPAddress newClientIP) { foreach (OTCNetServerClient mngr in _clients) { if (mngr.Connected && !mngr.IP.Equals(newClientIP)) { OTCNetMessage cmd = new OTCNetMessage(OTCNetMessage.CommandType.SendClientList, newClientIP); cmd.Message = mngr.IP.ToString() + ":" + mngr.ClientLogin; cmd.FromIP = _serverIP; cmd.From = SERVER_LOGIN; SendCommandToTarget(cmd); } } }
/// <summary> /// Sends a command to the remote client if the connection is alive. /// </summary> /// <param name="cmd">The command to send.</param> public void SendCommand(OTCNetMessage cmd) { if (_socket != null && _socket.Connected) { BackgroundWorker bwSender = new BackgroundWorker(); bwSender.DoWork += new DoWorkEventHandler(bwSender_DoWork); bwSender.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwSender_RunWorkerCompleted); bwSender.RunWorkerAsync(cmd); } else { OnCommandFailed(new EventArgs()); } }
private bool RemoveClientManager(IPAddress ip) { lock (this) { int index = IndexOfClient(ip); if (index != -1) { string name = _clients[index].ClientLogin; _clients.RemoveAt(index); //Inform all clients that a client had been disconnected. OTCNetMessage cmd = new OTCNetMessage(OTCNetMessage.CommandType.ClientLogOffInform, IPAddress.Broadcast); cmd.From = name; cmd.FromIP = ip; BroadCastCommand(cmd); return(true); } return(false); } }
private void SetMetaDataIfIsNull(OTCNetMessage cmd) { switch (cmd.Type) { case (OTCNetMessage.CommandType.ClientLoginInform): cmd.Message = IP.ToString() + ":" + _login; break; case (OTCNetMessage.CommandType.PCLockWithTimer): case (OTCNetMessage.CommandType.PCLogOFFWithTimer): case (OTCNetMessage.CommandType.PCRestartWithTimer): case (OTCNetMessage.CommandType.PCShutDownWithTimer): case (OTCNetMessage.CommandType.UserExitWithTimer): cmd.Message = "60000"; break; default: cmd.Message = "\n"; break; } }
private void bwConnector_DoWork(object sender, DoWorkEventArgs e) { try { _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _clientSocket.Connect(_serverEP); e.Result = true; _networkStream = new NetworkStream(this._clientSocket); _bwReceiver = new BackgroundWorker(); _bwReceiver.WorkerSupportsCancellation = true; _bwReceiver.DoWork += new DoWorkEventHandler(StartReceive); _bwReceiver.RunWorkerAsync(); // Inform to all clients that this client is now online. OTCNetMessage informToAllCMD = new OTCNetMessage(OTCNetMessage.CommandType.ClientLoginInform, IPAddress.Broadcast, IP.ToString() + ":" + _login); SendCommand(informToAllCMD); } catch { e.Result = false; } }
private void bwSender_DoWork(object sender, DoWorkEventArgs e) { OTCNetMessage cmd = (OTCNetMessage)e.Argument; e.Result = SendCommandToServer(cmd); }
/// <summary> /// Creates an instance of CommandEventArgs class. /// </summary> /// <param name="cmd">The received command.</param> public CommandEventArgs(OTCNetMessage cmd) { _cmd = cmd; }
private void StartReceive(object sender, DoWorkEventArgs e) { while (_socket.Connected) { if (_netStream.DataAvailable) { // Obtiene la longitud del mensaje byte[] buffer = new byte[4]; int readBytes = _netStream.Read(buffer, 0, 4); if (readBytes == 0) { break; } int numbytes = BitConverter.ToInt32(buffer, 0); // Lee los bytes del mensaje buffer = new byte[numbytes]; readBytes = _netStream.Read(buffer, 0, numbytes); if (readBytes == 0) { break; } // Convierte los datos en el mensaje OTCNetMessage cmd = new OTCNetMessage(buffer); OnCommandReceived(new CommandEventArgs(cmd)); /* * //Read the command's Type. * byte[] buffer = new byte[4]; * int readBytes = _netStream.Read(buffer, 0, 4); * if (readBytes == 0) * break; * CommandType cmdType = (CommandType)(BitConverter.ToInt32(buffer, 0)); * * //Read the command's target size. * string cmdTarget = ""; * buffer = new byte[4]; * readBytes = _netStream.Read(buffer, 0, 4); * if (readBytes == 0) * break; * int ipSize = BitConverter.ToInt32(buffer, 0); * * //Read the command's target. * buffer = new byte[ipSize]; * readBytes = _netStream.Read(buffer, 0, ipSize); * if (readBytes == 0) * break; * cmdTarget = System.Text.Encoding.ASCII.GetString(buffer); * * //Read the command's Message size. * string cmdMetaData = ""; * buffer = new byte[4]; * readBytes = _netStream.Read(buffer, 0, 4); * if (readBytes == 0) * break; * int metaDataSize = BitConverter.ToInt32(buffer, 0); * * //Read the command's Meta data. * buffer = new byte[metaDataSize]; * readBytes = _netStream.Read(buffer, 0, metaDataSize); * if (readBytes == 0) * break; * cmdMetaData = System.Text.Encoding.Unicode.GetString(buffer); * * OTCNetMessage cmd = new OTCNetMessage(cmdType, IPAddress.Parse(cmdTarget), cmdMetaData); * cmd.FromIP = this.IP; * if (cmd.Type == CommandType.ClientLoginInform) * cmd.From = cmd.Message.Split(new char[] { ':' })[1]; * else * cmd.From = this.ClientLogin; * OnCommandReceived(new CommandEventArgs(cmd)); */ } } OnDisconnected(new ClientEventArgs(this._socket)); Disconnect(); }
// This Semaphor is to protect the critical section from concurrent access of sender threads. private bool SendCommandToClient(OTCNetMessage cmd) { try { _semaphor.WaitOne(); // Envia la longitud del mensaje byte[] buffer = new byte[4]; buffer = BitConverter.GetBytes((int)cmd.ToByte().Length); _netStream.Write(buffer, 0, 4); _netStream.Flush(); // Envia el mensaje buffer = cmd.ToByte(); _netStream.Write(buffer, 0, buffer.Length); _netStream.Flush(); /* * // Type * byte[] buffer = new byte[4]; * buffer = BitConverter.GetBytes((int)cmd.Type); * _netStream.Write(buffer, 0, 4); * _netStream.Flush(); * * // Sender IP * byte[] FromIPBuffer = Encoding.ASCII.GetBytes(cmd.FromIP.ToString()); * buffer = new byte[4]; * buffer = BitConverter.GetBytes(FromIPBuffer.Length); * _netStream.Write(buffer, 0, 4); * _netStream.Flush(); * _netStream.Write(FromIPBuffer, 0, FromIPBuffer.Length); * _netStream.Flush(); * * // Sender Name * byte[] senderNameBuffer = Encoding.Unicode.GetBytes(cmd.From.ToString()); * buffer = new byte[4]; * buffer = BitConverter.GetBytes(senderNameBuffer.Length); * _netStream.Write(buffer, 0, 4); * _netStream.Flush(); * _netStream.Write(senderNameBuffer, 0, senderNameBuffer.Length); * _netStream.Flush(); * * // Target * byte[] ipBuffer = Encoding.ASCII.GetBytes(cmd.ToIP.ToString()); * buffer = new byte[4]; * buffer = BitConverter.GetBytes(ipBuffer.Length); * _netStream.Write(buffer, 0, 4); * _netStream.Flush(); * _netStream.Write(ipBuffer, 0, ipBuffer.Length); * _netStream.Flush(); * * // Meta Data. * if (String.IsNullOrEmpty(cmd.Message)) * cmd.Message = "\n"; * * byte[] metaBuffer = Encoding.Unicode.GetBytes(cmd.Message); * buffer = new byte[4]; * buffer = BitConverter.GetBytes(metaBuffer.Length); * _netStream.Write(buffer, 0, 4); * _netStream.Flush(); * _netStream.Write(metaBuffer, 0, metaBuffer.Length); * _netStream.Flush(); */ _semaphor.Release(); return(true); } catch { _semaphor.Release(); return(false); } }