Esempio n. 1
0
        private void SendDatagram(IPEndPoint remoteEP, UdpState udpState,
                                  string timeStamp, DatagramTypes datagramType, string text)
        {
            try {
                StringBuilder sendMessage = new StringBuilder();
                sendMessage.AppendLine();
                sendMessage.AppendLine(timeStamp);
                sendMessage.AppendLine(localClientVersion);
                sendMessage.AppendLine(Enum.GetName(typeof(DatagramTypes), datagramType));
                sendMessage.AppendLine(localUserKey);
                sendMessage.AppendLine(localAddress.ToString());
                sendMessage.AppendLine(localUserName);

                int headerLength = sendMessage.Length;
                sendMessage.Insert(0, headerLength);

                sendMessage.AppendLine(text);

                byte[] cipherMessage = Security.EncryptString(sendMessage.ToString());
                sendUdpClient.BeginSend(cipherMessage, cipherMessage.Length, remoteEP, SendCallback, udpState);
            }
            catch (Exception ex) {
                ErrorHandler.ShowError(ex);
            }
        }
Esempio n. 2
0
        private void RemoveQueryFromQueue(string key, DatagramTypes type)
        {
            try {
                //  Lock the list for thread safety.
                lock (queryQueue) {
                    List <PendingQuery> remList = new List <PendingQuery>();

                    foreach (PendingQuery status in queryQueue)
                    {
                        if (status.UserKey == key && status.Type == type)
                        {
                            remList.Add(status);
                        }
                    }

                    //  Remove all items that are common to both lists
                    queryQueue.RemoveAll(new Predicate <PendingQuery>(delegate(PendingQuery item) {
                        return(remList.Contains(item));
                    }));
                }
            }
            catch (Exception ex) {
                ErrorHandler.ShowError(ex);
            }
        }
Esempio n. 3
0
 public PendingQuery(string userKey, DatagramTypes type, string timeStamp, string userName, string text, int retries)
 {
     UserKey   = userKey;
     Type      = type;
     TimeStamp = timeStamp;
     UserName  = userName;
     Text      = text;
     Retries   = retries;
 }
Esempio n. 4
0
 /// <summary>
 /// Add a query with pending acknowledgement to the query queue.
 /// </summary>
 /// <param name="key"></param>
 /// <param name="text"></param>
 private void AddQueryToQueue(string key, DatagramTypes type, string timeStamp, string userName, string text, int retries)
 {
     try {
         //  Lock the list for thread safety.
         lock (queryQueue) {
             queryQueue.Add(new PendingQuery(key, type, timeStamp, userName, text, retries));
         }
     }
     catch (Exception ex) {
         ErrorHandler.ShowError(ex);
     }
 }
Esempio n. 5
0
        private void SendBroadcast(DatagramTypes datagramType, string text)
        {
            try {
                string timeStamp = DateTime.UtcNow.ToBinary().ToString();

                IPEndPoint remoteEP = new IPEndPoint(broadcastAddress, portNumber);
                if (sendUdpClient == null)
                {
                    sendUdpClient = new UdpClient();
                }

                UdpState udpState = new UdpState(remoteEP, sendUdpClient);

                SendDatagram(remoteEP, udpState, timeStamp, datagramType, text);
            }
            catch (Exception ex) {
                ErrorHandler.ShowError(ex);
            }
        }
Esempio n. 6
0
        private void SendMessage(DatagramTypes datagramType, string remoteUserKey, string text)
        {
            try {
                string timeStamp = DateTime.UtcNow.ToBinary().ToString();

                User remoteUser = GetUser(remoteUserKey);
                //  If user does not exist in user list, display a failure message.
                if (remoteUser == null)
                {
                    if (datagramType == DatagramTypes.Message)
                    {
                        AddMessageToQueue(remoteUserKey, MessageTypes.Failed, timeStamp, localUserName, localAddress.ToString(), text);
                    }
                    return;
                }
                string     remoteUserName = remoteUser.Name;
                IPAddress  remoteAddress  = IPAddress.Parse(remoteUser.Address);
                IPEndPoint remoteEP       = new IPEndPoint(remoteAddress, portNumber);
                if (sendUdpClient == null)
                {
                    sendUdpClient = new UdpClient();
                }

                UdpState udpState = new UdpState(remoteEP, sendUdpClient);

                switch (datagramType)
                {
                case DatagramTypes.Message:
                    AddQueryToQueue(remoteUserKey, DatagramTypes.Message, timeStamp, localUserName, text, 0);
                    break;

                case DatagramTypes.File:
                    string           filePath = text;
                    string           key      = System.Guid.NewGuid().ToString();
                    FileTransferInfo fileInfo = SendFile(key, remoteUserKey, remoteUserName, remoteAddress.ToString(), filePath);
                    //  Send message only if SendFile returned succesfully.
                    if (fileInfo != null)
                    {
                        string fileName = fileInfo.FileName;
                        string fileSize = fileInfo.FileSize;
                        text = key + Environment.NewLine + fileName + Environment.NewLine + fileSize;
                    }
                    else
                    {
                        //  Do not send the message.
                        return;
                    }
                    break;

                case DatagramTypes.Query:
                    int retries = int.Parse(text);
                    AddQueryToQueue(remoteUserKey, DatagramTypes.Query, timeStamp, string.Empty, string.Empty, retries);
                    break;

                case DatagramTypes.UserInfo:
                    text = userInfo.LogonName + Environment.NewLine + userInfo.MachineName + Environment.NewLine
                           + userInfo.IPAddress + Environment.NewLine + userInfo.OSName + Environment.NewLine
                           + userInfo.MessengerVersion;
                    break;
                }

                SendDatagram(remoteEP, udpState, timeStamp, datagramType, text);
            }
            catch (Exception ex) {
                ErrorHandler.ShowError(ex);
            }
        }
Esempio n. 7
0
 //  Constructor.
 public ChatArgs(DatagramTypes datagramType, string key, string message)
 {
     this.datagramType = datagramType;
     this.key          = key;
     this.message      = message;
 }