Example #1
0
        private static void ServerListener_Recieved(object sender, Listener.RecieveEventArgs e)
        {
            string           json   = Encoding.UTF8.GetString(e.Data);
            SocketActionBase action = JsonConvert.DeserializeObject <SocketActionBase>(json);

            //ConsoleWriteLine($"Recieved {json} via sockets");

            switch (action.Action)
            {
            case SocketActions.JOIN:
                MemberDto member = JsonConvert.DeserializeObject <MemberDto>(JsonConvert.SerializeObject(action.Data));
                ConsoleWriteLine($"{member.Name} joined chat");

                if (!CURRENT_CHAT.Members.Contains(member))
                {
                    CURRENT_CHAT.Members.Add(member);
                }

                if (!member.Equals(ME))
                {
                    ConnectTo(member);
                }

                UpdateCommonKey();
                break;

            case SocketActions.KEY_UPDATE:
                KeyExchangeDto keyExchange = JsonConvert.DeserializeObject <KeyExchangeDto>(JsonConvert.SerializeObject(action.Data));

                if (keyExchange.TTL + 1 == CURRENT_CHAT.Members.Count)
                {
                    CURRENT_CHAT_COMMON_KEY = DIFFIE.GetCommonPrivateKey(
                        keyExchange.KeyTemp,
                        USER_CHAT_KEYS[CURRENT_CHAT.Name].PrivateKey,
                        CURRENT_CHAT.P
                        );

                    ConsoleWriteLine($"Got common key: {CURRENT_CHAT_COMMON_KEY}");
                }
                else
                {
                    UpdateCommonKey(keyExchange);
                }

                break;

            case SocketActions.MESSAGE:
                Message message = JsonConvert.DeserializeObject <Message>(JsonConvert.SerializeObject(action.Data));

                string textCode = NOTEPAD.Decode(message.MessageText, CURRENT_CHAT_COMMON_KEY);
                string text     = NOTEPAD.GetCodeText(textCode);

                ConsoleWriteLine($"{message.SenderName}: {text} ({message.TimeStamp.ToShortTimeString()})");
                break;
            }
        }
        public void Send(SocketActionBase action)
        {
            if (Sender == null || !Sender.Connected)
            {
                Sender = new Socket(Endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Sender.Connect(Endpoint);
            }

            string json = JsonConvert.SerializeObject(action);

            byte[] data    = Encoding.UTF8.GetBytes(json);
            byte[] message = BitConverter.GetBytes(data.Length).Concat(data).ToArray();
            Sender.Send(message);

            Sender.Shutdown(SocketShutdown.Both);
            Sender.Close();
        }