예제 #1
0
        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);
            }
        }
예제 #2
0
        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();
        }
예제 #3
0
        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);
        }
예제 #4
0
 private void BroadCastCommand(OTCNetMessage cmd)
 {
     foreach (OTCNetServerClient mngr in _clients)
     {
         if (!mngr.IP.Equals(cmd.FromIP))
         {
             mngr.SendCommand(cmd);
         }
     }
 }
예제 #5
0
 private void SendCommandToTarget(OTCNetMessage cmd)
 {
     foreach (OTCNetServerClient mngr in _clients)
     {
         if (mngr.IP.Equals(cmd.ToIP))
         {
             mngr.SendCommand(cmd);
             return;
         }
     }
 }
예제 #6
0
 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);
         }
     }
 }
예제 #7
0
 /// <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());
     }
 }
예제 #8
0
        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);
            }
        }
예제 #9
0
        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;
            }
        }
예제 #10
0
        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;
            }
        }
예제 #11
0
        private void bwSender_DoWork(object sender, DoWorkEventArgs e)
        {
            OTCNetMessage cmd = (OTCNetMessage)e.Argument;

            e.Result = SendCommandToServer(cmd);
        }
예제 #12
0
 /// <summary>
 /// Creates an instance of CommandEventArgs class.
 /// </summary>
 /// <param name="cmd">The received command.</param>
 public CommandEventArgs(OTCNetMessage cmd)
 {
     _cmd = cmd;
 }
예제 #13
0
        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();
        }
예제 #14
0
        // 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);
            }
        }