private void ProcessClient(ConnectedPeerDataContainer client)
        {
            int             _messageType = 0;
            PrimaryCommands _primaryCommand;
            string          _clientSocketRemoteEndPointString = client.socket.RemoteEndPoint.ToString();
            string          _ip         = _clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':'));
            string          _nick       = client.nick;
            Socket          _peerSocket = client.socket;

            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { AddNewTab(client.nick, _clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':'))); }));
            WriteToLogbox("Connected to- " + _ip);
            try {
                string _message;
                int    _size;
                while (_peerSocket.Connected)
                {
                    if (!Network.NetworkCommunicationManagers.ReceiveDecodedIntOverSocket(_peerSocket, client.key, out _messageType))
                    {
                        break;
                    }
                    _primaryCommand = (PrimaryCommands)_messageType;

                    switch (_primaryCommand)
                    {
                    case PrimaryCommands.TextMessage:
                        if (!Network.NetworkCommunicationManagers.ReceiveDecodedIntOverSocket(_peerSocket, client.key, out _size))
                        {
                            break;
                        }

                        if (!Network.NetworkCommunicationManagers.ReceiveDecodedStringOverSocket(_peerSocket, client.key, out _message, _size))
                        {
                            break;
                        }

                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, _message, _nick, 1); }));
                        WriteToLogbox("Message Received- " + _nick + " (" + _clientSocketRemoteEndPointString + ") : " + _message);
                        break;

                    case PrimaryCommands.FileTransfer:
                        int _port1;
                        Network.NetworkCommunicationManagers.ReceiveIntOverSocket(_peerSocket, out _port1);
                        FileTransferContainer fileTransferContainer = new FileTransferContainer()
                        {
                            status       = FileTransferStatus.Running,
                            fileName     = "(Fetching....)",
                            ID           = _nick + " (" + _ip + ")",
                            progress     = 0,
                            size         = "(Fetching....)",
                            transferType = FileTransferType.Download,
                            pausedBy     = PausedBy.None,
                        };

                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
                            lock (RunningTransfers) {
                                RunningTransfers.Add(fileTransferContainer);
                            }
                        }));

                        Thread _thread = new Thread(() => {
                            if (!(new Network.FileTransfer(fileTransferContainer)).AcceptFileTransfer(_peerSocket, _port1, this))
                            {
                                WriteToLogbox("File Transfer from " + _nick + " (" + _clientSocketRemoteEndPointString + ") failed");
                                lock (fileTransferContainer) {
                                    if (fileTransferContainer.status != FileTransferStatus.Cancelled)
                                    {
                                        fileTransferContainer.status = FileTransferStatus.Error;
                                    }
                                }
                            }
                            else
                            {
                                WriteToLogbox("File Transfer from " + _nick + " (" + _clientSocketRemoteEndPointString + ") done");
                                lock (fileTransferContainer) {
                                    fileTransferContainer.status = FileTransferStatus.Finished;
                                }
                            }
                        });
                        _thread.Name         = "File Transfer from " + _clientSocketRemoteEndPointString;
                        _thread.IsBackground = true;
                        _thread.Start();
                        break;

                    default:
                        _message = "Invalid MessageCode Received. The other client is most probably running a newer version of the application with a new Feature.. !!";
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, _message, _nick, 0); }));
                        WriteToLogbox("Unsupported MessageCode from- " + _nick + " (" + _clientSocketRemoteEndPointString + ") received");
                        Network.NetworkCommunicationManagers.Disconnect(_peerSocket);
                        new Thread(() => ConnectToPeerByIP(_ip))
                        {
                            Name = _ip + " handler", IsBackground = true
                        }.Start();
                        try
                        {
                            connectedPeersList.Remove(client);
                        }
                        catch (Exception) { }
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Attempting to reconnect", _nick, 0); }));
                        WriteToLogbox("Attempting to reconnect- " + _ip);
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", _nick, 0); }));
                        WriteToLogbox("Disconnected- " + _ip);
                        return;
                    }
                }
                connectedPeersList.Remove(client);
            }
            catch (Exception) {
                try {
                    connectedPeersList.Remove(client);
                }
                catch (Exception) { }
            }
            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", _nick, 0); }));
            WriteToLogbox("Disconnected- " + _ip);
        }
        private void SendFileButtonClicked(object sender, RoutedEventArgs e)
        {
            Button _btn       = ((Button)sender);
            string _buttonTag = (string)_btn.Tag;
            string _ip        = _buttonTag.Remove(0, _buttonTag.IndexOf(':') + 1);
            string _nick      = _buttonTag.Remove(_buttonTag.IndexOf(':'));

            ConnectedPeerDataContainer _peer = new ConnectedPeerDataContainer();

            _peer.nick   = "";
            _peer.socket = null;
            foreach (ConnectedPeerDataContainer _connectedPeer in connectedPeersList)
            {
                string _connectedPeerSocketString = _connectedPeer.socket.RemoteEndPoint.ToString();
                if (_connectedPeerSocketString.Remove(_connectedPeerSocketString.LastIndexOf(':')) == _ip)
                {
                    _peer = _connectedPeer;
                    break;
                }
            }

            if (_peer.socket == null)
            {
                WriteToTab(_ip, "Client not available", nick, 0);
                return;
            }

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            // Display OpenFileDialog by calling ShowDialog method
            Nullable <bool> result = dlg.ShowDialog();

            // Get the selected file name and display in a TextBox
            if ((result.HasValue && result.Value))
            {
                string _filePath = dlg.FileName;

                FileTransferContainer fileTransferContainer = new FileTransferContainer()
                {
                    fileName     = System.IO.Path.GetFileName(_filePath),
                    ID           = _peer.nick + " (" + _ip + ")",
                    progress     = 0,
                    status       = FileTransferStatus.Running,
                    transferType = FileTransferType.Upload,
                    pausedBy     = PausedBy.None,
                };
                using (System.IO.FileStream _fs = new System.IO.FileStream(_filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) {
                    fileTransferContainer.sizeInBytes = _fs.Length;
                    fileTransferContainer.size        = Converters.DataConverter.bytesToReadableString(fileTransferContainer.sizeInBytes);
                }

                lock (RunningTransfers) {
                    RunningTransfers.Add(fileTransferContainer);
                }

                Thread _thread = new Thread(() => {
                    Network.NetworkCommunicationManagers.SendEncryptedIntOverSocket(_peer.socket, _peer.key, (int)PrimaryCommands.FileTransfer);

                    int _port1 = Network.NetworkCommunicationManagers.FindNextFreeTcpPort();
                    if (!Network.NetworkCommunicationManagers.SendIntOverSocket(_peer.socket, _port1))
                    {
                        WriteToLogbox("Failed to send file (Handshake Failed)");
                        lock (RunningTransfers) {
                            fileTransferContainer.status = FileTransferStatus.Error;
                        }
                        return;
                    }
                    ;

                    new Network.FileTransfer(fileTransferContainer, _filePath, _port1);
                });
                _thread.Name         = "File Transfer Handler";
                _thread.IsBackground = true;
                _thread.Start();
            }
        }