Ejemplo n.º 1
0
        private void SendMessage(string msg, ConnectedPeerDataContainer client)
        {
            Socket _peerSocket = client.socket;

            if (!Network.NetworkCommunicationManagers.SendEncryptedIntOverSocket(_peerSocket, client.key, (int)PrimaryCommands.TextMessage))
            {
                // connection was broken
                return;
            }


            if (!Network.NetworkCommunicationManagers.SendEncryptedIntOverSocket(_peerSocket, client.key, msg.Length))
            {
                // connection was broken
                return;
            }

            if (!Network.NetworkCommunicationManagers.SendEncryptedStringOverSocket(_peerSocket, client.key, msg))
            {
                // connection was broken
                return;
            }

            WriteToLogbox("Message Sent- " + client.nick + " (" + _peerSocket.RemoteEndPoint.ToString() + "): " + msg);
        }
Ejemplo n.º 2
0
        public void Disconnect(string nickAndIP)
        {
            ConnectedPeerDataContainer _obj = new ConnectedPeerDataContainer();

            _obj.nick   = "";
            _obj.socket = null;
            string _peerSocketRemoteEndPointString;

            foreach (ConnectedPeerDataContainer _peer in connectedPeersList)
            {
                _peerSocketRemoteEndPointString = _peer.socket.RemoteEndPoint.ToString();
                if ((_peer.nick + ":" + _peerSocketRemoteEndPointString.Remove(_peerSocketRemoteEndPointString.LastIndexOf(':'))) == nickAndIP)
                {
                    _obj = _peer;
                    break;
                }
            }
            if (_obj.socket != null)
            {
                Network.NetworkCommunicationManagers.Disconnect(_obj.socket);
            }

            Console.WriteLine("Client " + _obj.nick + "(" + nickAndIP.Remove(0, nickAndIP.IndexOf(':') + 1) + ") has been successfully disconnected");
            connectedPeersList.Remove(_obj);
        }
Ejemplo n.º 3
0
        private void CallButtonClicked(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;
            }

            MessageBox.Show("Calling Feature not implemented as yet, Please check back later :-D");
        }
Ejemplo n.º 4
0
        private void SendMessageButtonClicked(object sender, RoutedEventArgs e)
        {
            Button  _btn       = ((Button)sender);
            string  _buttonTag = (string)_btn.Tag;
            TextBox _txtbox    = ((Grid)((Button)sender).Parent).Children.OfType <TextBox>().First();
            string  _message   = _txtbox.Text.Trim();

            ((Grid)_btn.Parent).Children.OfType <TextBox>().First().Text = "";
            _txtbox.Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(delegate() { _txtbox.Focus(); }));
            string _ip   = _buttonTag.Remove(0, _buttonTag.IndexOf(':') + 1);
            string _nick = _buttonTag.Remove(_buttonTag.IndexOf(':'));

            if (_message == "")
            {
                return;
            }

            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;
            }
            WriteToTab(_ip, _message, _peer.nick, 2);
            Thread thread = new Thread(() => SendMessage(_message, _peer));

            thread.Name = "Message Sending to " + _ip;
            thread.Start();
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        private void AcceptGreetAndProcess(bool serverOrClient, Socket socket)
        {
            // Checks greeting message and processes if correct,
            // Extracts the nick and machine_name if true
            // serverOrClient is true for server and false in case of client

            //server recieves hello server, client receives hello client
            string _prefix;
            int    _size;

            if (serverOrClient)
            {
                _prefix = "Hello server, this is ";
            }
            else
            {
                _prefix = "Hello client, this is ";
            }

            string _message;

            if (!Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _size))
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }

            if (!Network.NetworkCommunicationManagers.ReceiveStringOverSocket(socket, out _message, _size))
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }

            //didn't start with the given greeting
            if (_message.Substring(0, _prefix.Length) != _prefix)
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }

            //no nickname sent
            _message = _message.Remove(0, _prefix.Length);
            if (_message.Length == 0)
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }

            string _clientSocketRemoteEndPointString;
            string _socketRemoteEndPointString = socket.RemoteEndPoint.ToString();

            //Check if already connected to the client
            foreach (ConnectedPeerDataContainer _client in connectedPeersList)
            {
                try {
                    _clientSocketRemoteEndPointString = _client.socket.RemoteEndPoint.ToString();
                    if (_clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':')) == _socketRemoteEndPointString.Remove(_socketRemoteEndPointString.LastIndexOf(':')))
                    {
                        WriteToLogbox("Already Connected to Client " + _socketRemoteEndPointString.Remove(_socketRemoteEndPointString.LastIndexOf(':')));
                        MessageBox.Show("Already Connected to Client");
                        Network.NetworkCommunicationManagers.Disconnect(socket);
                        return;
                    }
                }
                catch (ObjectDisposedException) { }
            }

            ConnectedPeerDataContainer obj = new ConnectedPeerDataContainer();
            int _indexOfDelimiter          = _message.IndexOf(':');

            if (_indexOfDelimiter == -1)
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }
            obj.nick = _message.Substring(0, _indexOfDelimiter);
            string _remainingMessage = _message.Substring(_indexOfDelimiter + 1);

            int _temp;

            if (serverOrClient)
            {
                if (password != null)
                {
                    _indexOfDelimiter = _remainingMessage.IndexOf(':');

                    if (_indexOfDelimiter == -1)
                    {
                        Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)PrimaryCommands.Error);
                        Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)ErrorCommands.PasswordRequired);
                        Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _temp);
                        Network.NetworkCommunicationManagers.Disconnect(socket);
                        return;
                    }

                    string _providedPassword = _remainingMessage.Substring(_indexOfDelimiter + 1);

                    _remainingMessage = _remainingMessage.Substring(0, _indexOfDelimiter);

                    if (_providedPassword != password)
                    {
                        Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)PrimaryCommands.Error);
                        Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)ErrorCommands.PasswordIncorrect);
                        Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _temp);
                        Network.NetworkCommunicationManagers.Disconnect(socket);
                        return;
                    }
                }
            }

            obj.encodedMachineName = _remainingMessage;
            obj.socket             = socket;

            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { AddNewTab(obj.nick, _socketRemoteEndPointString.Remove(_socketRemoteEndPointString.LastIndexOf(':'))); }));
            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_socketRemoteEndPointString.Remove(_socketRemoteEndPointString.LastIndexOf(':')), "Connected", obj.nick, 0); }));

            if (serverOrClient)
            {
                if (!Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)PrimaryCommands.OK))
                {
                    Network.NetworkCommunicationManagers.Disconnect(socket);
                    return;
                }
                ;
                if (!Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _temp))
                {
                    Network.NetworkCommunicationManagers.Disconnect(socket);
                    return;
                }
                ;
            }
            else
            {
                if (!Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _temp))
                {
                    Network.NetworkCommunicationManagers.Disconnect(socket);
                    return;
                }
                ;
                if (!Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)PrimaryCommands.OK))
                {
                    Network.NetworkCommunicationManagers.Disconnect(socket);
                    return;
                }
                ;
            }

            _clientSocketRemoteEndPointString = socket.RemoteEndPoint.ToString();
            string _ip   = _clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':'));
            string _nick = obj.nick;

            try {
                switch ((PrimaryCommands)_temp)
                {
                case PrimaryCommands.OK:
                    obj.key = Encryption.PerformAssymetricKeyExchangeUsingECDiffieHellmanOnSocket(socket);
                    break;

                case PrimaryCommands.Error:
                    Network.NetworkCommunicationManagers.ReceiveIntOverSocket(socket, out _temp);
                    Network.NetworkCommunicationManagers.SendIntOverSocket(socket, (int)PrimaryCommands.OK);
                    switch ((ErrorCommands)_temp)
                    {
                    case ErrorCommands.PasswordRequired:
                        WriteToLogbox("Password Required for " + _ip);
                        WriteToLogbox("Disconnected- " + _ip);
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Password Required", nick, 0); }));
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", nick, 0); }));
                        try {
                            socket.Shutdown(SocketShutdown.Both);
                            socket.Close();
                        }
                        catch (Exception) { }
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
                            Dialogs.ManuallyConnectDialog _dialog;
                            while (true)
                            {
                                _dialog = new Dialogs.ManuallyConnectDialog(_ip, _nick, "Password Required");
                                _dialog.ShowInTaskbar = false;
                                _dialog.Owner = this;
                                if (_dialog.ShowDialog() == false)
                                {
                                    return;
                                }
                                else
                                {
                                    string _address = _dialog.IP;

                                    if (_dialog.password == null)
                                    {
                                        continue;
                                    }

                                    byte[] hash = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(new UTF8Encoding().GetBytes(_dialog.password));
                                    string _encodedPassword = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();

                                    Thread _thread = new Thread(() => ConnectToPeerByIP(_address, _encodedPassword));
                                    _thread.Name = _address + " handler";
                                    _thread.IsBackground = true;
                                    _thread.Start();
                                    break;
                                }
                            }
                        }));
                        return;

                    case ErrorCommands.PasswordIncorrect:
                        WriteToLogbox("Incorrect password provided for " + _ip);
                        WriteToLogbox("Disconnected- " + _ip);
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Incorrect Password", nick, 0); }));
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", nick, 0); }));
                        try {
                            socket.Shutdown(SocketShutdown.Both);
                            socket.Close();
                        }
                        catch (Exception) { }
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
                            Dialogs.ManuallyConnectDialog _dialog;
                            while (true)
                            {
                                _dialog = new Dialogs.ManuallyConnectDialog(_ip, _nick, "Incorrect Password");
                                _dialog.ShowInTaskbar = false;
                                _dialog.Owner = this;
                                if (_dialog.ShowDialog() == false)
                                {
                                    return;
                                }
                                else
                                {
                                    if (_dialog.password == null)
                                    {
                                        continue;
                                    }
                                    string _address = _dialog.IP;

                                    byte[] hash = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(new UTF8Encoding().GetBytes(_dialog.password));
                                    string _encodedPassword = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();

                                    Thread _thread = new Thread(() => ConnectToPeerByIP(_address, _encodedPassword));
                                    _thread.Name = _address + " handler";
                                    _thread.IsBackground = true;
                                    _thread.Start();
                                    break;
                                }
                            }
                        }));
                        return;
                    }
                    return;

                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("Invalid MessageCode- " + _nick + " (" + _clientSocketRemoteEndPointString + ") : " + _temp);
                    break;
                }
            }
            catch (Exception) {
            }
            if (obj.key == null)
            {
                Network.NetworkCommunicationManagers.Disconnect(socket);
                return;
            }
            connectedPeersList.Add(obj);
            ProcessClient(obj);
        }
Ejemplo n.º 7
0
        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();
            }
        }